Gdy używam autofac mogę używać tej samej metody pojemnik scoped ale zamiast przechodzenia tej samej sesji do mojego repozytorium obiektów DAO/I zdać UnitOfWork że pojemnik jest zawężona. Jednostka pracy ma to w konstruktorze.
private readonly ISession _session;
private ITransaction _transaction;
public UnitOfWork(ISession session)
{
_session = session;
_transaction = session.BeginTransaction();
}
I Usuwać jest:
public void Dispose()
{
try
{
if (_transaction != null &&
!_transaction.WasCommitted &&
!_transaction.WasRolledBack)
_transaction.Commit();
_transaction = null;
}
catch (Exception)
{
Rollback();
throw;
}
}
Jestem (ab) przy użyciu deterministycznego wyrzucaniu rzeczy w autofac, aby poradzić sobie z tym, a także ja coś jak to.
Inną sprawą jest to, że zasadniczo kierujemy się wyłącznie do środowiska ASPNet i świadomie podjąłem decyzję, że transakcja jest powiązana z żądaniem internetowym. Tak więc transakcja na wzór żądania strony internetowej.
powodu, że mogę zrobić tego błędu kod obsługi w IHttpModule:
void context_Error(object sender, System.EventArgs e)
{
_containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
}
nie podjęły obejrzenia NHibernate.Burrow zbyt dokładnie, ale jestem pewien, że jest tam coś, że ma większość tego.
Podoba mi się rozwiązanie. Jednak inne pytanie dotyczy jakich metod powinienem zastosować [Transakcja]? Zgodnie z tym http://nhprof.com/Learn/Alert?name=DoNotUseImplicitTransactions wydaje się, że zawsze powinienem mieć transakcję, jeśli mam sesję, jednak to rozwiązanie wymaga ręcznego dodawania [Transakcji] wszędzie tam, gdzie używana jest sesja. –
Sprawdź zmodyfikowaną wersję. Prawdopodobnie będziesz wiedział, jak go zmodyfikować. Możesz także całkowicie pominąć atrybut [Transakcja] i zawsze rozpoczynać transakcję. To Twój wybór. Potrzebowałem tego atrybutu, ponieważ czasami musiałem robić 2 rzeczy w różnych transakcjach. zrobiłem to tak: // atrybut No transakcja public virtual void CallThis() { Trans1(); // zatwierdza Trans2(); // zobowiązuje } [Transakcja] public virtual void Trans1() {} [Transakcja] public virtual void TRANS2 umieszczany() {} – dmonlord
Mógłbyś wyjaśnić przypadek użycia dla dwóch transakcji? Jest to ważne, ponieważ jeśli mogę napotkać podobny przypadek użycia, inaczej przyjrzę się problemowi. –