gpt4 book ai didi

wpf - Ninject ActivationBlock 作为工作单元

转载 作者:行者123 更新时间:2023-12-04 06:03:25 25 4
gpt4 key购买 nike

我有一个带有 MVVM 的 WPF 应用程序。假设从 ViewModel 向下的对象组合如下所示:

MainViewModel
OrderManager
OrderRepository
EFContext
AnotherRepository
EFContext
UserManager
UserRepository
EFContext

我最初的方法是使用 EFContext 上的 .InCallScope() 和其他所有内容的 .InTransientScope() 将依赖项(来自 ViewModelLocator)注入(inject)到我的 View 模型中。这导致能够跨多个业务层对象(管理器)执行“业务事务”,这些对象最终在下面共享相同的 Entity Framework 上下文。对于工作单元类型的场景,我会在最后简单地 Commit() 说上下文。

这按预期工作,直到我意识到我不希望在 View 模型级别使用长期存在的 Entity Framework 上下文,描述了跨多个操作的数据完整性问题 HERE .我想做一些类似于我使用 .InRequestScope() 作为我的 Entity Framework 上下文的 Web 项目的事情。在我的桌面应用程序中,我将定义一个工作单元,如果您愿意,它将充当业务事务,通常它将所有内容都包含在按钮单击或类似事件/命令中。似乎使用 Ninject 的 ActivationBlock 可以为我做到这一点。
internal static class Global
{
public static ActivationBlock GetNinjectUoW()
{
//assume that NinjectSingleton is a static reference to the kernel configured with the necessary modules/bindings
return new ActivationBlock(NinjectSingleton.Instance.Kernel);
}
}

在我的代码中,我打算这样使用它:
//Inside a method that is raised by a WPF Button Command ...
using (ActivationBlock uow = Global.GetNinjectUoW())
{
OrderManager orderManager = uow.Get<OrderManager>();
UserManager userManager = uow.Get<UserManager>();

Order order = orderManager.GetById(1);
UserManager.AddOrder(order);
....
UserManager.SaveChanges();
}

问题:
  • 对我来说,这似乎复制了我在网络上开展业务的方式,我错过了这种方法有什么本质上的错误吗?
  • 我是否正确理解所有使用激活 block 的 .Get<> 调用都会在该 block 本地产生“单例”?我的意思是,无论我请求 OrderManager 多少次,它总是会在 block 内给我同一个。如果 OrderManager 和 UserManager 在下面组成同一个存储库(例如 SpecialRepository),则两者都将指向存储库的同一个实例,显然,下面的所有存储库都共享同一个 Entity Framework 上下文实例。
  • 最佳答案

    这两个问题都可以用"is"来回答:

  • 是的 - 这是你不应该做的服务地点
  • 是的,你理解正确
  • 关于wpf - Ninject ActivationBlock 作为工作单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671211/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com