Обработка двух разных потоков приложений - PullRequest
0 голосов
/ 21 ноября 2018

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

1 Ответ

0 голосов
/ 21 ноября 2018

Почему бы вам просто не ввести нужную вам зависимость?

public class DataProcessor
{
    private readonly IDataManager _dataManager;

    public DataProcessor(IDataManager dataManager)
    {
        _dataManager = dataManager;
    }

    public void Execute()
    {
        _dataManager.Run();
    }
}

В вашем Композиционном корне вы можете условно составить DataProcessor с реализацией IDataManager you 'Мне нравится:

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 не достаточно?

...