Обработка двух разных потоков приложений
Мы создаем приложение, в котором мы должны иметь как старую, так и новую версию для совместной работы (V1 старый, а V2 новый). Теперь для обработки нового потока мы используем одни и те же старые интерфейсы, причем все они одинаковы и отличаются только функциональностью, поэтому теперь мы должны определить именованный экземпляр, чтобы разрешить экземпляры для нового потока.
В процессе команды начали использовать Service Factory Pattern, как показано ниже
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>();
}
}
Поскольку Service Factory является анти-шаблонной, а также создает много сложностей при удалении старого потока в будущем, я хотел бы иметь способ инициализировать зависимости в самом контейнере (Structuremap 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", иначе экземпляр "старого потока"
1 ответ
Почему бы вам просто не ввести нужную вам зависимость?
public class DataProcessor
{
private readonly IDataManager _dataManager;
public DataProcessor(IDataManager dataManager)
{
_dataManager = dataManager;
}
public void Execute()
{
_dataManager.Run();
}
}
В вашем корне композиции вы можете создать условно DataProcessor
с реализацией IDataManager
Ты бы хотел:
public DataProcessor CreateDataProcessor()
{
if (_featureEvaluator.IsEnabled<"V2">())
{
IDataManager dm = new NewFlow();
return new DataProcessor(dm);
}
IDataManager dm = new OldFlow();
return new DataProcessor(dm);
}
Это похоже на переключатели функций. Почему, кстати, это _featureEvaluator
интерфейс? Не будет bool
хватает?