2011-06-01 81 views
0

你知道一个很好的例子吗?多UnitOfWorks,ISession和知识库

我想是这样的:

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

    uow.Commit(); 
} 

但这种情况是太理想,因为我也想为多个UnitOfWorks(每个主持人在大多数情况下,这是不是一个网页应用程序)。在这种情况下,库怎么会知道,如果我不给他们其中的UnitOfWork使用显式像

repository.UnitOfWork = uow; 

我的目标是让每一个的UnitOfWork包含ISession的背后,每个主持人这样一个UOW,每一个的Isession主持人。注:我知道的Isession是esentially UOW,但我必须继续这样...

任何建议表示赞赏

+0

你是什么意思UOW实现了NH会议没有做了吗? – Phill 2011-06-01 13:35:03

+0

我必须使用UoWs,存储库和规范来抽象出数据层的细节;并尽可能简化“演示”方面的使用 - >我期望很快我将不得不在服务器和客户端之间建立一个网络服务层,所以现在太多的耦合并不好......(YAGNI不适用:)) – 2011-06-03 20:45:08

+0

无论如何,去UoW注入存储库,似乎是最合适的 – 2011-06-03 20:45:36

回答

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(); 
}