Обработка двух разных потоков приложений

Мы создаем приложение, в котором мы должны иметь как старую, так и новую версию для совместной работы (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 хватает?

Другие вопросы по тегам