2016-06-10 4 views
6

Мне нужно позвонить нескольким службам, имеющим несколько API. Немногие из них в основном читаются (они возвращают мне некоторые данные), и немногие из них меняют состояние нескольких объектов (они в основном обновляют состояние нескольких объектов).Несколько вызовов API: шаблоны проектирования

Я ищу design pattern, который может быть применен к вышеуказанному сценарию.

Пример кода

Позволяет взять небольшой пример службы

AccountInfo A.getAccountInfo() 
void A.setAccountData(AccountInfo) 
AccountStatus A.getStatusForAccount 

...

Я думал, иметь общий интерфейс

interface CallAPI<Input , Output> { 
    public Output execute(Input) 
} 

Каждый API-интерфейс будет реализовывать этот интерфейс, а I c используйте шаблон Factory, чтобы получить экземпляры API.

Я хотел бы знать, есть ли лучший шаблон для того же самого или его можно реорганизовать по-другому. API-интерфейсы и сервисы будут только увеличиваться, и им должно быть проще настраивать новые API-интерфейсы, и у клиентов не должно быть дополнительных накладных расходов для написания адаптеров для новых API-интерфейсов.

+0

посмотрите на «Дооснащение», это похоже на то, что вы пытаетесь добиться –

ответ

0

Наилучший подход заключается в том, чтобы начать с создания целостного дизайна агностика из баз данных, деталей инфракрасной области и т. Д. Способ пойти с FactoryMethod, и если вы хотите создать семейство объектов, используйте абстрактную фабрику, чтобы вы могли иметь объекты SqlFamily, JsonFamily объекты и т. д. Затем вы можете создать бизнес-правила, в котором вы можете использовать несколько сервисов, сделать более интересным. Проект Agood подразумевает использование нескольких шаблонов desing, поэтому опция также будет дополнять фабрики, используя шаблонные методы для повторного использования кода, а также шаблон стратегии и т. Д. Вот код, в котором вы можете идентифицировать различные шаблоны, описанные выше, на месте:

public interface IRead<T> 
{ 
    T Fetch(); 
} 

public abstract class ServiceA 
{ 
    public abstract void OperationA(); 
    public abstract void OperationB(); 
} 

public abstract class ServiceB 
{ 
    public abstract void OperationD(); 
    public abstract void OperationE(); 
} 

public abstract class JsonServiceAReaderTemplate : IRead<ServiceA> 
{ 
    public abstract ServiceA Fetch(); 
} 

public sealed class JsonServiceAFetcher : JsonServiceAReaderTemplate 
{ 
    /// <summary> 
    /// Get parameters needded to load from json 
    /// </summary> 
    public JsonServiceAFetcher() 
    { 

    } 
    public override ServiceA Fetch() 
    { 
     //Load from Json store 
     throw new NotImplementedException(); 
    } 
} 

public abstract class JsonServiceBReaderTemplate : IRead<ServiceB> 
{ 
    public abstract ServiceB Fetch(); 
} 

public sealed class JsonServiceBFetcher : JsonServiceBReaderTemplate 
{ 
    /// <summary> 
    /// Get parameters needded to load from json 
    /// </summary> 
    public JsonServiceBFetcher() 
    { 

    } 
    public override ServiceB Fetch() 
    { 
     //Load from Json store 
     throw new NotImplementedException(); 
    } 
} 

public sealed class ServicesGateway 
{ 
    public ServiceA ServiceA { get; } 
    public ServiceB ServiceB { get; } 

    public ServicesGateway(IRead<ServiceA> serviceA, IRead<ServiceB> serviceB) 
    { 
     ServiceA = serviceA.Fetch(); 
     ServiceB = serviceB.Fetch(); 
    } 
} 

public interface IBusinessRule 
{ 
    void Execute(); 
} 

public sealed class BusinessRuleServiceAServiceB : IBusinessRule 
{ 
    private readonly ServicesGateway servicesGateway; 

    public BusinessRuleServiceAServiceB(ServicesGateway servicesGateway) 
    { 
     this.servicesGateway = servicesGateway; 
    } 

    public void Execute() 
    { 
     var serviceA = servicesGateway.ServiceA; 
     var serviceB = servicesGateway.ServiceB; 
     serviceA.OperationA(); 
     serviceA.OperationB(); 
     serviceB.OperationD(); 
     serviceB.OperationE(); 
    } 
} 

public sealed class ClientCode 
{ 
    public void Run() 
    { 
     //Inject from IoC 
     ServicesGateway gateway = new ServicesGateway(new JsonServiceAFetcher(), new JsonServiceBFetcher()); 
     var businessRule = new BusinessRuleServiceAServiceB(gateway); 
     businessRule.Execute(); 
    } 
} 

Надеюсь, что это поможет!