Повторно используйте шаг строителя для разных строителей - PullRequest
0 голосов
/ 13 февраля 2020

Для уровня доступа к данным C# я хочу использовать шаблон проектирования компоновщика для построения запросов к DBContexts (для большей гибкости на уровне бизнеса, но без прямого доступа к IQueryable) быстрым способом API.

Многие запросы имеют похожую структуру:

AccountQueryBuilder.GetAccounts().ForClient("clienta").WithBalanceOver(1943.4).QueryAsync();
/// ...
ContractQueryBuilder.GetContracts().ForClient("clienta").ExpiresAfter(2020-04-01).QueryAsync();

Здесь ForClient(string) повторно используется между различными компоновщиками. Как бы я спроектировал конструктор, чтобы я мог повторно использовать разные шаги компоновщика в разных компоновщиках, ограничивая при этом следующие доступные шаги компоновщика и не выполняя повторную реализацию ForClient(string) для каждого компоновщика? Будет несколько повторяющихся шагов в разных комбинациях

В настоящее время у меня есть что-то вроде этого:

class BuilderA : IBuilderReady, IBuilderStepA, IBuilderStepB, IBuilderStepC, IReusableStepA<IBuilderStepA>
{
    IBuilderStepA ReusableA() {/*Don't want to reimplement in every builder*/}
    IBuilderStepB A() {...}
    IBuilderStepC B() {...}
    IBuilderReady C() {...}
    IEnumerable<EntitySomething> Query() {...}
}
...