Единица работы и шаблон хранилища - PullRequest
12 голосов
/ 15 января 2010

У меня есть настройка шаблона репозитория с использованием NHibernate. Базовый класс выглядит так:

public interface IUnitOfWork : IDisposable
{
    void Commit();
    void Rollback();
}

// generic NHibernate implementation of IUnitOfWork here

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    private NHibernateUnitOfWork _unitOfWork;

    public NHibernateRepositoryBase(NHibernateUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
    public T Get(object id)
    {
        return _unitOfWork.Session.Get<T>(id);
    }

    // ...
}

Как видите, я позволяю заполнять единицы работы через конструктор (используя StructureMap). Я заполняю объекты репозитория в моих веб-сервисах ASP.NET следующим образом:

[WebService(Namespace = "...")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class ModuleService : System.Web.Services.WebService
{
    public IUserAccountRepository UserAccountRepo { get; set; }

    public ModuleService()
    {
        // tell IoC to inject properties
        ObjectFactory.BuildUp(this);
    }

    // ...
}

Как вы, возможно, сможете сделать вывод, моя проблема в том, что из-за дизайна я потерял контроль над жизненным циклом единицы работы. Ранее я сделал единицу работы контекстно-зависимым объектом, и хранилище получало ссылку на него через что-то вроде:

public class NHibernateRepositoryBase<T> : IRepository<T>
{
    public T Get(object id)
    {
        return NHibernateUnitOfWork.GetCurrent().Session.Get<T>(id);
    }

    // ...
}

Этот предыдущий дизайн позволял мне контролировать жизненный цикл единицы работы в моем коде, создавая единицу работы из UnitOfWorkFactory в операторе using. Я пытался передать большую часть работы в руки контейнера IoC, но я думаю, что на самом деле сделал шаг назад. Что вы думаете о любой реализации?

1 Ответ

3 голосов
/ 18 января 2010

Обычно хорошо, чтобы ваш контейнер IoC обрабатывал как можно больше. В сети шаблон единицы работы обычно инициализируется в начале запроса и фиксируется в конце (выполняется откат, если есть какие-либо исключения). Таким образом, ваш репозиторий примет ISession в конструкторе вместо unitofwork. Таким образом, вашему хранилищу не придется иметь дело с фиксацией или чем-то еще, и это будет обрабатываться автоматически для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...