По-объркан от всякога с работни единици срещу никакви и избягване на микро-управление на транзакции в хранилището!

Бях стигнал до заключението, че няма причина да използвам UnitOfWork върху сесия на NHibernate и питах в този въпрос относно най-добрия начин да не се налага изрично да създавате транзакция за всяко действие за постоянство на база данни.

Само за да бъде пренасочен обратно към идеята за единица работа. Е, по-нататъшното разследване ме доведе до мястото, където първоначално трябваше да не внедря отделен модел на единица работа върху NHibernate (един пример, наред с други).

Моят проблем е как да не използвате единица работа И да не управлявате микро транзакции в хранилище и да го държите отделно?


person pghtech    schedule 03.05.2011    source източник
comment
Мислех, че управлението на начина на живот на nHibernate се е погрижило за това вместо вас. Какъв изглежда е проблемът с използването на заявка?   -  person Oded    schedule 03.05.2011
comment
Нямам проблем с индивидуалната заявка, това е отделянето на моето хранилище от транзакция.   -  person pghtech    schedule 03.05.2011


Отговори (1)


Все още можете да отделите хранилището от транзакция. Основното нещо, което ще трябва да управлявате, е жизненият цикъл на вашата сесия.

Във вашия мениджър на транзакции можете да напишете нещо подобно

public class TransactionManager
{
    private ISession session;

    public TransactionManager(ISession session)
    {
        this.session = session;
    }

    public void BeginTransaction()
    {
         session.BeginTransaction();
    }

    public void CommitTransaction()
    {
        session.Transaction.Commit();
    }
}

След това във вашето хранилище просто ще инжектирате сесията

public class Repository
{
    private ISession session;

    public Repository(ISession session)
    {
        this.session = session;
    }

    public T Get<T>(int id)
    {
        return session.Get<T>(id);
    }
}

Ако използвате същата сесия в мениджъра на транзакции като хранилището. Вашето хранилище ще работи с изрична транзакция.

person Vadim    schedule 03.05.2011
comment
Правех същото нещо с работна единица, което е повече или по-малко това, което мисля, че изложихте - това, което изглежда не мога да си обясня, е, че ако не предавате екземпляр на TransactionManager към хранилището, как ще извиквали ли сте някога BeginTransaction() или CommitTransaction()? - person pghtech; 03.05.2011
comment
Това не е изпълнение на единица работа. Въпреки това може да се използва в изпълнение на единица работа. Ако не искате хранилището да управлява микро транзакцията, кодът, който използва хранилището, ще трябва да управлява транзакцията. - person Vadim; 03.05.2011
comment
Добре. Но все пак, как ще извикате някой от тези методи, ако не предавате обекта TransactionManager? - person pghtech; 03.05.2011
comment
Да го предам на какво? Вероятно кодът, който използва хранилището, ще има екземпляр на мениджъра на транзакциите. Тъй като по мое мнение това е огромна болка и нарушава модели като инверсия на контрола, просто бих използвал модел на единица работа, за да управлявам транзакциите си. - person Vadim; 03.05.2011