Общий шаблон ICommonService для нескольких объектов Домена - PullRequest
0 голосов
/ 19 февраля 2020

Я записываю слой данных серверного SPA Blazor (только для одного проекта) и следую примеру, где учитель играет с одним объектом домена: Сотрудник. Таким образом, у него есть класс EmployeeService для внедрения, и этот класс реализует IEmployeeService. В моем случае у меня есть еще несколько таких классов:

public interface IDesignManagerService
{
    Task<List<DesignManager>> GetDesignManagers();
    Task<bool> CreateDesignManager(DesignManager newStage);
    Task<bool> EditDesignManager(byte id, DesignManager modifiedDesignManager);
    Task<DesignManager> SingleDesignManager(byte id);
    Task<bool> DeleteEmployee(byte id);
}

public interface IFundedService
{
    Task<List<Funded>> GetFunded();
    Task<bool> CreateFunded(Funded newStage);
    Task<bool> EditFunded(byte id, Funded modifiedFunded);
    Task<Funded> SingleFunded(byte id);
    Task<bool> DeleteEmployee(byte id);
}

public interface IGateService
{
    Task<List<Gate>> GetGates();
    Task<bool> CreateGate(Gate newStage);
    Task<bool> EditGate(byte id, Gate modifiedGate);
    Task<Gate> SingleGate(byte id);
    Task<bool> DeleteEmployee(byte id);
}

Сразу же я чувствую, что должен быть общий интерфейс с методами basi c, чтобы я мог каким-то образом использовать тип Dynami c как Create<Employee> или Create<Gate>. Это может быть достигнуто здесь? Я знаю, чего я могу хотеть, но не могу найти помощи из-за недостаточного знакомства с шаблоном.

1 Ответ

1 голос
/ 19 февраля 2020

Microsoft уже предоставила образец для этого шаблона. См. официальные документы и исходный код на GitHub .

. Чтобы самостоятельно ответить на ваш вопрос, вам необходим generi c IAsyncRepository в качестве общего интерфейса:

// an empty marker interface
public interface IAggregateRoot{ }

// a common entity that has an `Id` property
public abstract class BaseEntity
{
    public virtual int Id { get; protected set; }
}

// the common Repo interface
public interface IAsyncRepository<T> where T : BaseEntity, IAggregateRoot
{
    Task<T> GetByIdAsync(int id);
    Task<IReadOnlyList<T>> ListAllAsync();
    Task<IReadOnlyList<T>> ListAsync(ISpecification<T> spec);
    Task<T> AddAsync(T entity);
    Task UpdateAsync(T entity);
    Task DeleteAsync(T entity);
    Task<int> CountAsync(ISpecification<T> spec);
}

И затем сделайте так, чтобы ваша специфицированная c служба репо унаследовала IRepository<T>. Например, ваш IGateRepository может быть реорганизован как:

public class Gate: BaseEntity, IAggregateRoot
{
    // Add Gate props here
}


public interface IGateService : IAsyncRepository<Gate>
{
    // add more interface methods if you want
}

Таким образом, вы можете вызывать сервис с обобщенными типами c:

await gateSvc.AddAsync(gate);
await fundedSvc.AddAsync(funded);
...  
...