C# 基于CQRS模式的服务层

C# 基于CQRS模式的服务层,c#,entity-framework,asp.net-mvc-5,cqrs,C#,Entity Framework,Asp.net Mvc 5,Cqrs,我正在尝试使用CQRS模式而不是存储库构建应用程序,并尝试使用Onion体系结构而不是使用MVC5堆栈构建n层 我现在有以下几层: Web.Data - Contains DbContext Web.Model - POCO classes Web.Service - Implementation of Commands and Queries using MediatR --Commands -----Request -----Handlers --Queries

我正在尝试使用CQRS模式而不是存储库构建应用程序,并尝试使用Onion体系结构而不是使用MVC5堆栈构建n层

我现在有以下几层:

Web.Data - Contains DbContext 
Web.Model - POCO classes
Web.Service - Implementation of Commands and Queries using MediatR
   --Commands
   -----Request
   -----Handlers
   --Queries
   -----Request
   -----Handlers
Web.UI
我想把业务逻辑(例如验证)放在处理程序类上,但我确认这些类可以直接访问EF。这仍然是一个很好的地方来表达这些逻辑吗

如果我有电子邮件逻辑或发货逻辑呢?在传统的层上,它们自然地转到应用程序服务,在该服务上注入存储库,它们如何适应当前的体系结构?我们不想走存储库的路线,因为我们希望将EF作为一个整体来利用,而不是将其进一步抽象


我是否应该有一个接受MediatR接口的传统服务层,并让控制器拥有服务接口?

处理程序类应该处理命令并包含协调任务完成的逻辑。这种逻辑可以包括对域模型的委托、持久性和检索,以及调用其他服务(如发送邮件或电子邮件)。注意,命令处理程序只是应用程序服务的另一种风格。因此,它不应该直接访问EF,也不应该是一个放置业务逻辑验证的地方。

我的第一个问题:您的模型只是纯属性包还是有行为?如果是后者,则应将业务逻辑放入其中。当然,例如,如果验证跨越多个模型/AR,那么您需要一个服务/facade。从本质上来说,验证是一种视情况而定的方式,但你可以看看这一点,寻找好主意。我建议你在决定与实体结婚之前先签一份婚前协议。它只不过是DataSet 2.0,它有一个漂亮的建模界面和一堆实际上不应该在应用层内完成的东西。我恳请您将EF的使用限制为ADO.NET生成器和dto。将其视为Linq To Sql over view和存储过程,您将避免痛苦。@K.AlanBates任何框架或技术都可能在不熟练的从业者手中造成问题。EF也不例外。我认为使用EF构建的数以万计的成功系统有点不言而喻了。@PhilSandler第一句话不言而喻,也不是我要说的。你的“成功”陈述是无保留的。成功构建?成功的域目标?成功实现了一些关键绩效指标?我说(并且一直说)实体框架在构建团队中是一种有价值的技术,可以降低构建成本,但一旦您将系统移交给维护团队,它就无法与magic(克拉克第三定律)区分开来。任何系统都可以支持一定数量的魔法,我试着为比节省一些打字更重要的事情保留魔法。@PhilSandler当然是(讨论这些的地方)OP提到他想脱离EF擅长的领域,但他说他正在使用实体框架。对我来说,这是一个完美的时机来提及“使用EntityFramework=会有一段不愉快的时光”,这就像你应该吃比萨饼的时候炸薯条一样