Я использовал ServiceLocator
, который я DIing с Unity
public ServiceLocator(IUserStore userStore, IProdcutsStore productsStore, ...etc) {}
public IUserStore UserStore
{
get { return userStore; }
}
Все это работало нормально, но я хотел ленивое создание репозиториев, поскольку они используются довольно редко.
Итак, мой ServiceLocator
теперь выглядит так
public ServiceLocator(IUnityContainer container) {}
public IUserStore UserStore
{
get { return (IUserStore)container.Resolve(typeof(IUserStore)); }
}
// ...etc
Теперь я получаю действительно бесполезную ошибку ResolutionFailedException
Ошибка разрешения зависимости, type = "DomainModel.DataServices.Interface.IUserStore", name = "". Сообщение об исключении: текущая операция сборки (сборка ключа Build Key[DomainModel.DataServices.Interface.IUserStore, null]) не удалась: текущий тип, DomainModel.DataServices.Interface.IUserStore, является интерфейсом и не может быть создан. Вам не хватает сопоставления типов? (Тип стратегии BuildPlanStrategy, индекс 3)
Говорить мне, что мой тип интерфейса не может быть создан, потому что это интерфейс, довольно бессмысленно. Я знаю, что это интерфейс, поэтому контейнер должен решать его за меня!
В любом случае, здесь следует отметить, что я знаю, что сопоставление типов в конфигурации в порядке, так как, когда я вводил интерфейс типа напрямую, вместо того, чтобы пытаться откладывать загрузку, это разрешилось без проблем.
Что мне не хватает, что означает, что что-то где-то должно измениться, чтобы ленивая загрузка была такой?
Обновление: я предполагаю, что здесь происходит то, что когда я ввожу контейнер в ServiceLocator, «основной» контейнер каждый раз создает экземпляр нового контейнера, который затем не настраивается должным образом. Я думаю, может быть, мне нужен какой-то способ указать, что я должен передать this
в качестве контейнера, а не разрешать его с помощью нового экземпляра.