Nhibernate 多个UnitOfWorks、ISession和存储库

Nhibernate 多个UnitOfWorks、ISession和存储库,nhibernate,transactions,repository,unit-of-work,Nhibernate,Transactions,Repository,Unit Of Work,你知道这方面的好例子吗 我想要的是: using(IUnitOfWork uow = UnitOfWork.Start()) { repositoryA.Add(insanceOfA); repositoryB.Add(instanceOfB); uow.Commit(); } 但这种情况太理想了,因为我还需要多个UnitOfWorks(在大多数情况下,每个演示者一个,对于web应用程序来说这是而不是)。在这种情况下,如果我不明确地给存储库这样的信息,存储库如何知道使

你知道这方面的好例子吗

我想要的是:

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

    uow.Commit();
}
但这种情况太理想了,因为我还需要多个UnitOfWorks(在大多数情况下,每个演示者一个,对于web应用程序来说这是而不是)。在这种情况下,如果我不明确地给存储库这样的信息,存储库如何知道使用哪个工作单元呢

repository.UnitOfWork = uow;
我的目标是让每个工作单元后面都包含一个会话,所以每个演示者一个UOW,每个演示者一个ISession。注意:我知道ISession本质上是UOW,但我必须这样做


任何建议都非常感谢

我所做的就是将应该使用的工作单元传递给存储库

要实现这一点,您可以确保必须在存储库的构造函数中传递存储库必须使用的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();
}

我要做的是将应该使用的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();
}

你的UoW打算实现NH会话尚未实现的目标是什么?我必须使用UoW、存储库和规范来抽象出数据层的细节;同时,为了尽可能简化“表示”端的使用->我预计很快我将不得不在服务器和客户端之间放置一个网络服务层,所以现在太多的耦合是不好的。。。(YAGNI不适用:))无论如何,将UoW注入到存储库中似乎是最好的选择,因为您无缘无故地添加了另一层抽象。NH会话是一个UoW,它可以注入到您的存储库中,所以您真正做的就是为自己做更多的工作。但是你似乎已经走上了这条路,祝你好运。你的UoW计划实现什么,NH会话还没有做到?我必须使用UoWs、存储库和规范来抽象出数据层的细节;同时,为了尽可能简化“表示”端的使用->我预计很快我将不得不在服务器和客户端之间放置一个网络服务层,所以现在太多的耦合是不好的。。。(YAGNI不适用:))无论如何,将UoW注入到存储库中似乎是最好的选择,因为您无缘无故地添加了另一层抽象。NH会话是一个UoW,它可以注入到您的存储库中,所以您真正做的就是为自己做更多的工作。但你似乎已经走上了那条路,祝你好运。