Ошибка StructureMap, разрешающая зависимость Open Generic

Итак, я подключил свой открытый плагин в StructureMap следующим образом

scan.ConnectImplementationsToTypesClosing(typeof(IRepository<>));

Но все же получить страшные

Экземпляр по умолчанию не определен для PluginFamily KharaSoft.Utils.IRepository`1[[KharaSoft.App.Core.DomainObject, KharaSoft.App.Core, Версия =1.0.0.0, Культура = нейтральная, PublicKeyToken=null]

Я выполняю отладку после инициализации контейнера и вижу, что на самом деле зарегистрирован экземпляр RepositoryBase<>, поэтому он знает, что я хочу сделать, но не закрывает его для меня. Есть что-то, чего я здесь не хватает?

2 ответа

Решение

Так что я не уверен, что это "лучший" способ, но я обнаружил, что это работает. Я должен был явно зарегистрировать открытую реализацию плагина следующим образом:

ObjectFactory.Initialize(
  x =>
    {
      x.Scan(scan =>
        {
          scan.Assembly(typeof (IRepository<>).Assembly);
          scan.WithDefaultConventions();
        });
      x.For(typeof (IRepository<>)).Use(typeof (RepositoryBase<>));
      x.For<IUnitOfWork>().Use<MyDataContext>();
    });
return ObjectFactory.Container;

Видите, я не хотел закрывать родовой файл напрямую во всех случаях. Так что теперь мой контроллер MVC может принимать зависимость, как так

public PlayerController(IRepository<Player> players)
{
  Players = players;
}

И StructureMap закроет зависимость с экземпляром RepositoryBase

Трудно тренироваться, не видя полного кода сканирования или макета вашего проекта. Есть несколько шагов по умолчанию, которые я обычно выполняю, когда у меня есть эта проблема.

Убедитесь, что у вас есть

scan.WithDefaultConventions()

Убедитесь, что сборка, содержащая классы репозитория, включена в проверку:

x.AssemblyContainingType(typeof(UserRepository)); 

Убедитесь, что у вас есть правильные реализации на месте:

IRepository<User>

имеет соответствие

Repository<User>

Надеюсь, что этот совет поможет вам найти проблему.

Другие вопросы по тегам