MVC - 最佳模式(UoW +存储库+服务+ DI)

时间:2016-07-14 09:55:28

标签: asp.net-mvc entity-framework unit-testing dependency-injection repository-pattern

我一直在做mvc一段时间,但这是我第一次接触DI。

我使用Ninject开始了一个新项目,看起来非常简单易懂,但是我看到的几乎所有教程都有UoW,存储库和服务。

我的理解是:

  • 存储库 - 与EF / MongoDB / XML交互的抽象层/无论数据库是什么(CRUD操作)
  • UoW - 一组相关的操作,可以使用 N 存储库执行将在控制器中使用的任务
  • 服务我真的不明白这一点,因为它使用多个 UoW 来执行“更多任务”,这似乎只是又一步?我迷失在这一个。

好的,我花了一些时间“吃掉” Repository 的东西,因为我更喜欢通过 UoW 传递 EF Context

如果我忘记了存储库并只使用上下文,这样可以吗?或者是否用于任何Unit Test任务?

什么是服务的用法? 因为我可以在 UoW 中执行每个操作/任务,然后在控制器内部调用它。

是否有更好的模式可供使用?

2 个答案:

答案 0 :(得分:2)

由于这些非常常见,你可能会谈论其中任何一个,我将对每个人做一个简短的解释。

域名服务:当您拥有一个实体并开始将逻辑推入其中时,您可能会遇到逻辑的一部分并非真正属于该实体的点,因此您创建一个域服务来抽象出这个逻辑。一个例子是:

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();
    }
    ...
}

应用程序服务:这些是您将从控制器调用以封装特定任务所需操作的服务。让我们假设您有一个控制器来接收友情请求批准或拒绝。您的应用程序服务应该能够获得足够的数据:

  • 查找友谊请求域实体
  • 调用其批准或拒绝方法
  • 调用方法以将更改保留回数据库
  • 将相关信息返回给控制器

基础架构服务:这些服务将抽象出与业务无关的逻辑,但与应用程序的工作方式有关。一个示例是用于验证在您的请求中收到的安全令牌或执行日志记录活动的服务。

答案 1 :(得分:1)

EFs DBContext已经实现了UoW和Repository模式,所以yiu没有任何好处,可以在yiur自己的代码中再次实现它们。

服务是抽象业务逻辑的一种方式,因此可以重用