Your questions are confusing. perhaps because your example is so lightweight


    IItemRepo
    {
       Item GetItem(id)
       List<Item> GetItemsByName(name)
       List<Item> GetItemsBySpecifedFiltersAndConditions(colour, weight, whatever)
       ...
    }
    
    Api
    {
       start()
       {
          //repo is initialised in startup for DI where required
          diContainer.Register<IItemRepo>(new ItemRepo(dbconnection))
       }
    }
    
    ItemController
    {
       GetItem(id)
       {
           //api controllers / application layer will know about the underlying data layer
           //api layer uses repo by reference passed in from di
           return _repo.GetItem(id);
       }
    
       ...
    }
    
    SomeDomainApplications
    {
        ShipItems(itemIdsToShip)
        {
           foreach(id in itemIdsToShip)
           var i = apiClient.GetItem(id) //item retrieved from API. Item is an AR domain object, its fine to pass domain objects around you dont need dtos and the repo is not passed around
           if(somelogic)
               ShippingDomainLogic.Ship(i) //business log shares item object but doesnt see repo
    
           apiClient.DeleteItem(i);
        }
    
    }