我有一个WPF应用程序,它遵循命令/查询模式并使用EF作为ORM.
在我看来,当创建新的ViewModel时,应该创建新的DbContext实例,并且应该在所有命令/查询处理程序中重复使用相同的实例(注入),这些处理程序是在特定ViewModel的范围内创建的.在ViewModel的生命周期结束时,应该处理DbContext.
如何使用Simple Injector实现这样的设置?
如果您正在应用此处和此处所述的命令/处理程序和查询/处理程序模式,那么最合乎逻辑的做法是DbContext
确定执行命令和查询的生命周期.
这可以通过定义允许应用范围的单个通用装饰器来实现:
using SimpleInjector;
using SimpleInjector.Extensions.LifetimeScoping;
public class LifetimeScopedCommandHandlerDecorator : ICommandHandler
{
private readonly Container container;
private readonly Func> decorateeProvider;
public LifetimeScopedCommandHandlerDecorator(Container container,
Func> decorateeProvider) {
this.container = container;
this.decorateeProvider = decorateeProvider;
}
public void Handle(T command) {
using (container.BeginLifetimeScope()) {
this.decorateeProvider().Handle(command);
}
}
}
这个装饰器可以注册为最后一个装饰器,如下所示:
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(LifetimeScopedCommandHandlerDecorator<>),
Lifestyle.Singleton);
完成此操作后,您可以DbContext
使用注册LifetimeScopeLifestyle
.
您可以使用查询处理程序执行相同的操作.
这样做的最大好处是允许您强制隔离命令处理程序和查询处理程序,最大限度地降低通过共享影响彼此的风险,DbContext
以便以后通过发送您的处理程序更轻松地将处理程序移动到其他层在布线命令和查询信息,如解释在这里.