您可以将通用控制器和通用服务用于后端CRUD API吗?

时间:2019-07-20 03:52:54

标签: c# rest asp.net-web-api crud

我正在从事一个后端项目,为许多实体构建RESTful API。现在,任务是为设计中的每个当前实体构建基本的CRUD功能。稍后,我将变得更加复杂,但是现在我要做的就是创建API端点,这些端点使您可以为每个实体从存储库中获取,创建,更新或删除。

由于我想将相同类型的操作应用于多种不同的实体类型,因此我想使用一个通用控制器类。这让我避免为每个实体的控制器写样板(方法名称,为每个实体指定的HTTP动词等)。看起来像这样:

<hello name="{{ name }}"></hello>

<form [formGroup]="form" (ngSubmit)="submit()">
  <label formArrayName="orders" *ngFor="let order of form.controls.orders.controls; let i = index">
    <input type="checkbox" [formControlName]="i"
    (change)="toggleVisibility($event, i)">
      <span >
       {{orders[i].text1}}
      </span>

  </label>

  <br>
  <button [disabled]="!form.valid">submit</button>
</form>

因此实际上效果很好。它也是可扩展的,因此我仍然可以添加所需的CRUD样板之外的任何其他端点。但是后来我想,如果我可以使控制器通用,为什么不也使服务通用?

每个控制器都注入了服务,该服务使控制器可以执行这些CRUD操作。每个服务依次注入一个存储库,该存储库知道如何与基础结构层实际交互。

问题在于尝试在通用服务类内部实现通用服务对象。我正在尝试使用抽象类来使每个服务对象都继承自。该抽象类将包含主要的CRUD方法,因为这些方法对于每个实体基本上都是相同的操作。

我尝试了多种实现此方法的方法,但未能使其起作用。每次我做时,我都会四处转转并迷惑自己。我要么无法对其进行编译,要么就可以对其进行编译,并且我也无法使通用服务正确地注入到控制器中。

那么,如果您想重用尽可能多的代码,该怎么办?我想为标准CRUD操作提供可重用的通用方法,但是可以选择添加每种实体类型唯一的其他方法。我可以仅使用通用控制器就可以使其正常工作,但是接下来我要在每个服务中复制主要的CRUD代码。

1 个答案:

答案 0 :(得分:0)

假设您正在使用EF,通过使用存储库模式,这是一项简单的任务。名为Repository的泛型类,具有用于创建,读取,更新和删除的方法。您可以选择将接口引入更好的依赖项注入:

公共接口IRepository { 公共无效Add(T实体); // .... }

公共类存储库:IRepository { 公共存储库(/ *在此处注入DI * /) {}

公共无效Add(T实体) { _dbSet.Add(entity); } // ..... }