我已经做了一段时间的mvc,但这是我第一次接触DI。
我用Ninject开始了一个新项目,它看起来非常简单易懂,但是我看到的几乎每个教程都有UoW,存储库和服务。
我的理解是:
- 存储库 - 用于与EF/MongoDB/XML/任何可能是数据库的交互的抽象层(CRUD操作)
- UoW - 关联在一起的操作集,它可以使用 N 个存储库来执行将在控制器中使用的任务
- 服务 我真的不明白这一点,它似乎只是多一步,因为它使用多个 UoW 来执行"更多任务"?我迷失在这一点上。
好的,我花了一些时间来"吃"存储库的东西,因为我更喜欢通过 UoW 传递 EF 上下文。
如果我忘记了存储库而只使用上下文可以吗?还是用于任何Unit Test
任务?
服务的用途是什么?因为我可以在 UoW 内执行每个动作/任务,然后在控制器中调用它。
有没有更好的模式集可以使用?
由于这些非常常见,并且您可能正在谈论其中任何一个,因此我将对每个进行简要解释。
域服务:当您有一个实体并开始将逻辑推送到其中时,您可能会达到逻辑的一部分实际上不属于该实体的地步,因此您创建一个域服务来抽象出此逻辑。一个例子是:
public class Shipment
{
...
public void CalculateFee(IFeeCalculatorService feeCalculatorService)
{
... Any additional and entity relevant logic for fee calculation can be here as well.
this.Fee = feeCalculatorService.Calculate();
}
...
}
应用程序服务:这些是您将从控制器调用的服务,用于封装特定任务所需的操作。假设您有一个控制器来接收友谊请求批准或拒绝。应用程序服务应接收足够的数据,以便能够:
- 查找友谊请求域实体
- 调用其批准或拒绝方法
- 调用方法以将该更改保留回数据库
- 将相关信息返回给控制器
基础结构服务:这些服务将抽象出与业务无关但与应用程序的工作方式相关的逻辑。例如,用于验证在请求中收到的安全令牌或执行日志记录活动的服务。
EFs DBContext已经实现了UoW和Repository模式,因此yiu在yiur自己的代码中再次实现它们没有任何好处。
服务是一种抽象业务逻辑以便可以重用的方法