Я имею дело с одной проблемой. Представьте себе эту примерную ситуацию. У меня есть один модуль, например. UserModule с вложенным IUserRepository. IUserRepository может иметь больше реализаций, например. IUserRepositorySql и IUserRepositoryDefault.Зависимость впрыска - именованные зависимости
public class UserModule : IUserModule
{
private readonly IUserRepository userRepository;
public UserModule(IUserRepository userRepository)
{
if (userRepository == null) throw new ArgumentNullException("userRepository");
this.userRepository = userRepository;
}
}
Я хотел бы определить, какая реализация IUserRepository будет использоваться в UserModule. Я хочу избежать шаблона Factory, который рассматривается как IoC antipattern в Marc Seeman book, и я хотел бы достичь этого только с конфигурацией контейнера.
Я использую LightInject и имеет что-то вроде named services, но его можно использовать только на верхнем уровне. Мне нужно что-то вроде этого:
var container = new ServiceContainer();
container.Register<IUserRepository, UserRepositorySql>("Sql");
container.Register<IUserRepository, UserRepositoryDefault>("Default");
container.Register<IUserModule, UserModule>();
var instance = container.GetInstance<IUserModule>("Sql");
Этого код должен возвращать экземпляр IUserModule с закачиваемым например UserRepositorySql, но, конечно, это не так.
У вас есть какая-то душа для этого в LightInject, пожалуйста?
Я нашел функцию annotation in Lightinject, где я могу впрыскивать некоторые свойства соответствующих типов, но мне это не так нравится.
Есть ли у вас опыт в некоторых других контейнерах IoC? Как вы/какая функция разрешает эту проблему?
Я прочитал книгу Марка Семанна, но не могу вспомнить, что он назвал фабрику анти-узором. Можете ли вы ссылаться на страницы, где он это делает? – Steven
Можете ли вы объяснить, почему вам действительно нужно это сделать? – Steven
Я знаю, что Марк Seemann считает, что Service Locator является анти-шаблоном (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/), так вот как я прочитал этот вопрос. – Astrotrain