Единица работы и шаблон репозитория

У меня есть установка шаблона репозитория с помощью 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 в операторе использования. Я пытался поместить больше работы в руки контейнера МОК, но я думаю, что на самом деле предпринял шаги назад. Каковы Ваши мысли о любой реализации?

12
задан MrDustpan 8 March 2010 в 21:57
поделиться

1 ответ

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

3
ответ дан 2 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: