我刚开始学DDD。我正在将域事件放入cqrs应用程序中,但我遇到了一个基本任务:如何在域项目中使用mediatr.inotification标记接口,而不创建对基础设施的域依赖。
我的解决方案分为以下四个项目:
MyApp.Domain
- Domain events
- Aggregates
- Interfaces (IRepository, etc), etc.
MyApp.ApplicationServices
- Commands
- Command Handlers, etc.
MyApp.Infrastructure
- Repository
- Emailer, etc.
MyApp.Web
- Startup
- MediatR NuGet packages and DI here
- UI, etc.
目前,我已经在ui项目中安装了mediatr和mediatr.net core di包,并使用.addmediatr()将它们添加到di中,使用命令
services.AddMediatR(typeof(MyApp.AppServices.Commands.Command).Assembly);
它从appservices项目中扫描和注册命令处理程序。
当我想定义一个事件时,问题就来了。为了让mediatr处理我的域事件,需要用mediatr.inotification接口标记它们。
namespace ObApp.Domain.Events
{
public class NewUserAdded : INotification
{
...
}
在这种情况下,如何正确地标记我的事件以便MediaTR可以使用它们?我可以为事件创建自己的标记接口,但是如果没有某种方法将它们自动转换为mediatr.inotification,mediatr将无法识别这些事件。
这仅仅是使用多个项目的缺点吗?不过,即使我使用的是单个项目,如果在域部分中使用mediatr.inotification,我也会在域中放置一个“外部”接口。
当我的用户实体从ef的identityuser继承时,我遇到了同样的问题。在这种情况下,网络共识似乎说是务实的,继续下去,让轻微的污染,以节省许多头痛。这是另一个类似的案子吗?我不介意为实用主义牺牲纯洁,但不只是为了懒惰。
这是一个基本问题,将发生在我使用的其他包,所以我期待着解决这个问题。
谢谢您!
最佳答案
最好您的域层不依赖于任何基础设施,但由于绑定的原因,在cqrs中很难获得。我可以从我的经验告诉你。但是,您可以最小化这种依赖性。一种方法是创建自己的EventInterface
扩展MediatR.INotification
并在域代码中使用该接口。这样,如果你想改变基础设施,你只需要在一个地方改变。