Несколько UnitOfWorks, ISession и репозиториев - PullRequest
0 голосов
/ 01 июня 2011

Знаете ли вы хороший пример где-нибудь для этого?

Что я хотел бы, это следующее:

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

    uow.Commit();
}

Но этот случай слишком идеален, потому что то, что я тоже хочу, является множественнымUnitOfWorks (на одного докладчика в большинстве случаев, а для веб-приложения это , а не ).В таком случае, как репозитории узнают, какой UnitOfWork использовать, если я не предоставлю им явно такие, как

repository.UnitOfWork = uow;

Моя цель состоит в том, чтобы каждый UnitOfWork содержал ISession позади, поэтому одно UOW на докладчика, одноСессия на докладчика.Примечание: я знаю, что ISession по сути дела UOW, но я должен действовать следующим образом ...

Любые советы приветствуются

1 Ответ

3 голосов
/ 01 июня 2011

Что я делаю, это передаю 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();
}
...