多个UnitOfWorks,ISession和存储库

时间:2011-06-01 13:30:26

标签: nhibernate transactions repository unit-of-work

你知道某个地方有一个很好的例子吗?

我想要的是以下内容:

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

    uow.Commit();
}

但是这个案例太理想了,因为我还想要的是多个UnitOfWorks(在大多数情况下,每个演示者,对于Web应用程序来说)。在这种情况下,如果我没有明确地给出明确喜欢的单元,那么存储库将如何知道要使用哪个UnitOfWork

repository.UnitOfWork = uow;

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

赞赏任何建议

1 个答案:

答案 0 :(得分:3)

我所做的是将应该用于存储库的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();
}