В настоящее время я пытаюсь написать фабричный класс, который не полагается на местоположение службы.Заводская модель без сервисного локатора
Единственная альтернатива, которую я могу придумать, это использовать инжектор конструктора для ввода всех возможных экземпляров, но это может привести к неожиданностям, поскольку классы передаются через ссылку. Возможно, это будет дорого и беспорядочно, если число возможных поставщиков растет.
Поставщики сами представляют собой комплексные классы, которые имеют свои собственные зависимости, поэтому ручная конструкция не соответствует действительности.
Обновлено место службы Пример:
public class ProviderFactory : IProviderFactory
{
private readonly IProviderConfigurationService _providerConfigurationService;
public enum SearchType
{
Foo,
Bar
}
public ProviderFactory(IProviderConfigurationService providerConfigurationService)
{
_providerConfigurationService = providerConfigurationService;
}
public Collection<IProvider> GetProviderInstances(SearchType searchType)
{
// Provider configuration service will read a XML/DB store to retrieve list of search providers applicable for a search type
var providerList = _providerConfigurationService.GetProviderList(searchType);
return new Collection<IProvider>(providerList.ForEach(x=> ServiceLocator.GetInstance(typeof(x))).ToList()) ;
}
}
Каковы мои другие варианты? В настоящее время я использую Unity для DI.
Зачем вам нужно так много объекта зависимостей в первую очередь? – Muctadir
В зависимости от типа поиска мне нужно будет вызвать другой набор поставщиков. Это также действительный вопрос о фабричной схеме в целом, поскольку задача заключается в создании конкретных примеров, которые противоречат принципам IoC. –
Какая структура DI вы используете? Ninject имеет расширение Факторий, которое является фантастическим для этого. –