2012-05-30 10 views
6

Próbuję zacząć w świecie "DDD z C#". Używam NHibernate jako narzędzia ORM, próbując w ten sposób opracować model PI (Persistence Ignorance). Jednak w niektórych moich podmiotach (które są reprezentowane jako POCOS) mam reguły biznesowe w ustawieniach moich właściwości. Na przykład mam jednostkę "Użytkownik", która ma flagę wskazującą, czy ten użytkownik jest zablokowany, czy też nie, gdy ta flaga jest prawdziwa, drugie pole o nazwie "Data bloku" musi zostać automatycznie wypełnione zgodnie z bieżącą datą. Wszystko wydaje się bardzo jasne i proste, ale problem pojawia się w momencie, gdy odzyskiwam użytkowników, którzy już utrwalili się w bazie danych, nawet jeśli zablokowani użytkownicy będą mieli aktualizację "Zablokowanych dat" do bieżącej daty, zgodnie z odrobiną ta logika. Początkowo myślałem, że w drugiej flaga "isLoaded" oznacza, że ​​obiekt jest uwodniony przez NHibernate, a następnie ta logika nie zostanie uruchomiona, jednak nie wydawało się to PI. Wszelkie sugestie, jak to poprawić?Model domeny z problemem projektowania Nhibernate

Odpowiedz

4

Możesz zdefiniować strategię dostępu do pola w swoim mapowaniu dla właściwości IsBlocked. Zasadniczo powiesz NHibernate, aby używał bazowego pola prywatnego (_isBlocked) zamiast właściwości, a zatem logika ustawiacza w właściwości IsBlocked nie zostanie wykonana.

This SO question ma dobrą odpowiedź na temat strategii dostępu.

Oficjalny NHibernate documentation.

Jeśli używasz Fluent NHibernate do mapowania, to jak można to określić:

Map(x => x.IsBlocked).Access.CamelCaseField(Prefix.Underscore); 
4

Oprócz rozwiązania problemu Miroslavs dla NHibernate, bym naprawdę polecam odejście od logiki za oddanie nieruchomości seterów, zwłaszcza gdy inne pola wymagają zmiany.

public void Block() 
{ 
    _isBlocked = true; 
    _blockedDate = DateTime.Now; 
} 

Zobacz odpowiedzi na this question, dlaczego.

+0

+1 za tę rekomendację –