Как отделить внутренние системы с помощью разделения интерфейса и вызова их методов из службы
Поэтому в компании, где я работаю, в настоящее время у нас есть несколько бэкэнд-систем для разных клиентов, которые выполняют примерно одинаковые функции с некоторыми ключевыми различиями, и все они реализуют один массивный интерфейс. Давайте назовем это 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>();
}
}