开发者

Multiple UnitOfWorks, ISession and repositories

开发者 https://www.devze.com 2023-03-09 23:04 出处:网络
Do you know a good example somewhere for this? What I would like is the following: using(IUnitOfWork uow = UnitOfWork.Start())

Do you know a good example somewhere for this?

What I would like is the following:

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

    uow.Commit();
}

But this case is too ideal, because what I also want is multiple UnitOfWorks (per presenter in most cases, and this is not for a web app). In that case, how will repositories know which UnitOfWork to use if I don't give them that explicitly like

repository.UnitOfWork = uow;

My goal is to have every UnitOfWork contain a ISession behind, so one UOW per presenter, one ISession per pres开发者_如何学运维enter. Note: I know that ISession is esentially UOW, but I must proceed this way...

Any advices are appreciated


What I do, is pass the unitOfWork that should be used to the Repository.

To achieve this, you can make sure that you have to pass the UnitOfWork instance that must be used by the repository in the repository's constructor.

In order to make it all a bit more user-friendly, you can create extension methods on your UnitOfWork that are specific for your project (supposing that your UnitOfWork is generic and used in multiple projects) that look like this:

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

Then, it enables you to do this:

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

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

    uow.Commit();
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号