Нет, вам не нужно этого делать.
Я бы посоветовал вам реализовать абстрактный шаблон фабрики для выбора правильной реализации провайдера в зависимости от значения, известного во время выполнения.
Для примера, пожалуйста, посмотрите здесь: http://alsagile.com/archive/2010/06/28/Abstract-Factory-and-IoC-Container-in-asp-net-MVC.aspx.
Это в контексте MVC, но может быть легко реализовано в других сценариях.
Пример:
Вы можете зарегистрировать свой сервис следующим образом (псевдокод):
x.For<IService>().Use<Service>();
x.For<IProvider>().Use<Provider1>().Named("provider1");
x.For<IProvider>().Use<Provider2>().Named("provider2");
Вам нужен способ внедрить контейнер в вашу фабрику Abstract.Вы можете обернуть это, например, следующим образом:
public interface IProviderFactory
{
object GetInstance<IProvider>();
object GetNamedInstance<IProvider>(string key);
}
И реализация:
public class ProviderFactory : IProviderFactory
{
private readonly Container _container
public ProviderFactory (Container container)
{
_container = container;
}
...
}
И настроить StructureMap для разрешения зависимостей в вашей абстрактной фабрике следующим образом:
x.For<IProviderFactory>.Use(new ProviderFactory(this));
Затем в вашу Службу вы должны добавить фабрику провайдера следующим образом
public class Service : IService
{
private readonly IProviderFactory _providerFactory;
public Service(IProviderFactory factory)
{
if (factory == null)
throw new ArgumentNullException("factory", "providerfactory cannot be null");
_proiderFactory = factory;
}
public void Load(string providerName)
{
var provider = _providerFactory.GetNamedInstance(providerName);
// do some operation on provider
}
}
Это должно работать.