【问题标题】:Multiple UnitOfWorks, ISession and repositories多个 UnitOfWorks、ISession 和存储库
【发布时间】:2011-06-01 13:30:25
【问题描述】:

你知道这方面的一个很好的例子吗?

我想要的是以下内容:

using(IUnitOfWork uow = UnitOfWork.Start())
{
    repositoryA.Add(insanceOfA);
    repositoryB.Add(instanceOfB);

    uow.Commit();
}

但是这种情况太理想了,因为我还想要多个 UnitOfWorks(在大多数情况下,每个演示者,这对于网络应用程序来说不是)。在那种情况下,如果我不明确地给他们喜欢,存储库将如何知道使用哪个 UnitOfWork

repository.UnitOfWork = uow;

我的目标是让每个 UnitOfWork 都包含一个 ISession,因此每个演示者一个 UOW,每个演示者一个 ISession。注意:我知道 ISession 本质上是 UOW,但我必须这样做......

大家多多指教

【问题讨论】:

  • 你的 UoW 是什么意思来实现 NH 会议尚未做到的?
  • 我必须使用 UoW、存储库和规范来抽象出数据层的细节;并且尽可能简化“演示”方面的使用->我希望很快我将不得不在服务器和客户端之间放置一个网络服务层,所以现在过多的耦合并不好......(YAGNI不适用 :) )
  • 无论如何,将 UoW 注入存储库,似乎最合适
  • 好吧,您确实无缘无故地添加了另一层抽象。 NH Session 是一个 UoW,它可以注入到您的存储库中,因此您真正所做的就是为自己做更多的工作。但看来你已经走这条路了,祝你好运。

标签: nhibernate transactions repository unit-of-work


【解决方案1】:

我所做的是将应该使用的 unitOfWork 传递给存储库。

要实现这一点,您可以确保必须在存储库的构造函数中传递存储库必须使用的 UnitOfWork 实例。

为了使其更加用户友好,您可以在您的 UnitOfWork 上创建特定于您的项目的扩展方法(假设您的 UnitOfWork 是通用的并用于多个项目),如下所示:

public static class UnitOfWorkExtensions
{
    public static IRepositoryA GetRepositoryA( this UnitOfWork uow )
    {
         return new RepositoryA(uow);
    }

    public static IRepositoryB GetRepositoryB( this UnitOfWork uow )
    {
         return new RepositoryB(uow);
    }
}

然后,它使您能够做到这一点:

using(IUnitOfWork uow = UnitOfWork.Start())
{
    var repositoryA = uow.GetRepositoryA();
    var repositoryB = uow.GetRepositoryB();

    repositoryA.Add(insanceOfA);
    repositoryB.Add(instanceOfB);

    uow.Commit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2015-01-02
    • 2011-09-12
    • 2018-08-27
    相关资源
    最近更新 更多