Как отделить внутренние системы с помощью разделения интерфейса и вызова их методов из службы

Поэтому в компании, где я работаю, в настоящее время у нас есть несколько бэкэнд-систем для разных клиентов, которые выполняют примерно одинаковые функции с некоторыми ключевыми различиями, и все они реализуют один массивный интерфейс. Давайте назовем это ISystem. Теперь каждая реализация здесь, вероятно, на самом деле реализует только половину функций, а для остальных из них просто генерируется исключение, которое не реализовано.

Поэтому я собираюсь разделить этот интерфейс бога на несколько меньших, но не совсем уверен, как это сделать.

Основной поток вызовов функций в нашем ландшафте работает следующим образом:

servicecall => GetSystemInstance => вызов функции на экземпляре

Теперь моя проблема заключается в основном в GetSystemInstance. Теперь он всегда возвращает ISystem, и вы можете вызывать все методы для этого. Как бы я поступил так, когда все системы реализуют разные наборы интерфейсов?

Лучший выстрел в этом - это то, что я лгал здесь, но у меня есть ощущение, что есть лучшие решения для этого!

    static void Main(string[] args)
    {
        var result = new service().GetResultsFeatureA(BackendSystem.SystemA, 1);
    }

    public List<ResultFeatureA> GetResultsFeatureA(BackendSystem system, int id)
    {
        var systemInstance = System.GetSystemInstance(system, FeatureSet.FeatureA);
        return ((IFunctionsFeatureA)systemInstance).GetResultsFeatureA(id);            
    }

    public static class System
{
    public static SystemBase GetSystemInstance(BackendSystem system, FeatureSet features)
    {
        switch (system)
        {
            case BackendSystem.SystemA:
                switch (features)
                {
                    case FeatureSet.FeatureA:
                    case FeatureSet.FeatureB:
                        return new SystemA();
                    default:
                        throw new global::System.NotImplementedException();
                }

            case BackendSystem.SystemB:
                switch (features)
                {
                    case FeatureSet.FeatureA:
                        return new SystemB();
                    case FeatureSet.FeatureB:
                    default:
                        throw new global::System.NotImplementedException();
                }
            default:
                throw new global::System.NotImplementedException();
        }
    }
}

    public abstract class SystemBase
    {
    public string ConnString { get; set; }
    }

    public class SystemB : SystemBase, IFunctionsFeatureA
    {
    public List<ResultFeatureA> GetResultsFeatureA(int id)
    {
        return new List<ResultFeatureA>();
    }
    }


    public class SystemA : SystemBase, IFunctionsFeatureB, IFunctionsFeatureA
{
    public List<ResultFeatureB> GetResultsFeatureB(int id)
    {
        return new List<ResultFeatureB>();
    }

    public List<ResultFeatureA> GetResultsFeatureA(int id)
    {
        return new List<ResultFeatureA>();
    }
}

0 ответов

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