Мы создаем приложение, в котором мы должны иметь как старую, так и новую версию для совместной работы (V1 старый, а V2 новый).Теперь для обработки нового потока мы используем одни и те же старые интерфейсы, причем все они одинаковы и отличаются только функциональностью, поэтому теперь нам нужно определить именованный экземпляр, чтобы разрешить экземпляры для нового потока.
Врабочие группы начали использовать шаблон фабрики обслуживания, как показано ниже
class DataProcessor
{
private readonly IDataManager _dataManager;
public DataProcessor(IServiceFactory serviceFactory)
{
_dataManager = serviceFactory.GetInstance<IDataManager>();
}
public void Execute()
{
_dataManager.Run();
}
}
Класс фабрики обслуживания
public class ServiceFactory : IServiceFactory
{
private readonly IFeatureEvaluator _featureEvaluator;
public ServiceFactory(IFeatureEvaluator featureEvaluator)
{
_featureEvaluator = featureEvaluator;
}
public T GetInstance<T>()
{
if (_featureEvaluator.IsEnabled<"V2">())
{
return ObjectFactory.GetInstance<T>("V2")
}
return ObjectFactory.GetInstance<T>();
}
}
Поскольку фабрика обслуживания является анти-шаблоном, а также создает много сложностей при удалении старойВ будущем я хотел бы получить способ инициализации зависимостей в самом контейнере (structmap ioc) или для работы «Pure DI», чтобы мы могли избежать головной боли.Любая идея о том, как решить эту проблему.
Обновление: реализация IDataManager
public interface IDataManager
{
void Run();
}
public class OldFlow : IDataManager
{
public void Run()
{
//
}
}
public class NewFlow : IDataManager
{
public void Run()
{
//
}
}
У IDataManager есть 2 реализации, и разрешение экземпляра должно основываться на _featureEvaluator, если поток V2 тогда должен быть "newflow"инстанцированный еще экземпляр "старого потока"