当前位置:  开发笔记 > 编程语言 > 正文

每个屏幕/ ViewModel的DbContext Lifestyle(WPF +简单注入器)

如何解决《每个屏幕/ViewModel的DbContextLifestyle(WPF+简单注入器)》经验,为你挑选了1个好方法。

我有一个WPF应用程序,它遵循命令/查询模式并使用EF作为ORM.

在我看来,当创建新的ViewModel时,应该创建新的DbContext实例,并且应该在所有命令/查询处理程序中重复使用相同的实例(注入),这些处理程序是在特定ViewModel的范围内创建的.在ViewModel的生命周期结束时,应该处理DbContext.

如何使用Simple Injector实现这样的设置?



1> Steven..:

如果您正在应用此处和此处所述的命令/处理程序和查询/处理程序模式,那么最合乎逻辑的做法是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以便以后通过发送您的处理程序更轻松地将处理程序移动到其他层在布线命令和查询信息,如解释在这里.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有