Подходящ жизнен цикъл за класове хранилища, използващи Castle Windsor

Когато започнах с Windsor, мислех, че DI ще бъде просто. Сега това ме обърква все повече и повече.

Едно хранилище ми се струва клас с единичен жизнен цикъл. Трябва да имам един екземпляр на FooRepository, за да заредя и запазя Foos в базата данни по време на живота на приложението.

Всяко хранилище обаче съдържа препратка към UnitOfWork, което прави мръсната проверка, работи с базата данни и т.н. UnitOfWork има жизнен цикъл на PerWebRequest - изобщо няма смисъл UnitOfWork да бъде сингълтън, тъй като единичен екземпляр би могъл (например) изтрийте промените, направени от няколко потребителски сесии едновременно.

Така че тогава имам единичен FooRepository, съдържащ препратка към UnitOfWork, който в края на сесията се изхвърля! Дори не съм сигурен какъв ефект би имало това върху поведението на хранилището, но не звучи добре.

Може ли някой да обясни, на прост английски (добре, може би с някакъв код), подходящия начин за управление на жизнения цикъл на Repository и UnitOfWork класове в уеб приложение?


person David    schedule 23.09.2010    source източник


Отговори (2)


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

С други думи, добре е преходното да зависи от сингълтон или компонент за уеб заявка, но не и обратното.

Начинът, по който подхождам към Repository - UoW сценарий е, че моят UoW е на уеб заявка, но хранилищата са без състояние и преходни.

person Krzysztof Kozmic    schedule 23.09.2010
comment
Преходно? А, интересно. Но вероятно използването на хранилище на PerWebRequest с PerWebRequest UoW (както правя в момента) също е добре? (Изглежда, че работи за мен, така или иначе.) - person David; 23.09.2010
comment
Какво имате предвид под лица без гражданство? Искате да кажете, че те не държат препратка към UoW? - person David; 23.09.2010
comment
О, предложена редакция - „компонентът не трябва да зависи от други компоненти, които ще надживее“. Но знам какво имаш предвид, благодаря! - person David; 23.09.2010
comment
без гражданство означава, че няма собствена държава. Той поддържа препратка към UoW - person Krzysztof Kozmic; 23.09.2010

Когато казвате хранилище, предполагам, че имате предвид хранилище, което абстрахира сесия на Nhibernate. Ако е така, тогава никога не трябва да бъде сингълтън. Ако е сингълтон, тогава множество нишки на заявки ще потъпчат една на друга сесия. Аз лично видях няколко дефекта около това. Тъй като жизненият цикъл на Castle по подразбиране е единичен, ако разработчикът забрави изрично да маркира жизнения цикъл на компонент, започват да се случват лоши неща.

В идеалния случай трябва да е на заявка (следвайки концепцията за единица работа). Единственият ездач на този подход е, че сте активирали режима на съвместимост с Asp.net във вашето приложение (ако това не е Asp.net). Другият начин е да маркирате преходен процес на хранилище. Но недостатъкът на този подход е, че Castle ще създаде нов обект на хранилище всеки път, когато компонент има нужда от него.

person uttamkini    schedule 05.10.2011