Ошибка 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>
Надеюсь, что этот совет поможет вам найти проблему.