хранилище; Съпоставяне между POCOs / Linq-to-Sql класове обекти

Правя първата си програма за бази данни със Sql Express. В момента използвам Linq-to-Sql за достъп до данни и моите класове на хранилище връщат обекти от тип "entity". Значение; Разширявам класовете обекти на dbml, за да ги използвам като мои класове на бизнес обекти. Сега искам да направя това по-отделено; и имат POCO бизнес обекти.

Тук се чудя какви различни решения могат да съществуват. Изглежда ми, че трябва ръчно да картографирам свойство по свойство, всеки клас обект в клас на домейн, в хранилищата. Досега имам около 20 таблици с общо няколкостотин колони. Сега.. Просто искам да проверя дали това е общ/типичен подход, който все още използвате? И ако има алтернативи без въвеждане на прекомерна сложност, какво би било това?


person bretddog    schedule 21.01.2011    source източник


Отговори (2)


AutoMapper е добър инструмент за използване за извършване на преобразувания от клас към клас. Мисля обаче за DAL, който съчетава Linq2Sql и AutoMapper, и си мисля защо просто не отида с Fluent NHibernate? Настройва се много лесно, работи с почти всяка база данни, включително SqlExpress, и има доставчик на Linq, който се интегрира доста безпроблемно. Всичко това е безплатен код с отворен код и се използва много често, така че има достатъчно документация и поддръжка.

Ако искате да останете с Linq2Sql, но имате по-пълнофункционален модел на домейн, можете да помислите за извличане на вашия модел на домейн от DTO. Това ще ви позволи да имате бизнес логиката в домейна, като свойствата се предават на DTO. Имайте предвид обаче, че Linq2SQL обектите няма да могат да бъдат директно прехвърлени към домейн обекти; ще ви е необходим конструктор в домейна, който взема DTO и копира информацията в домейна (изисква поне еднопосочно картографиране на DTO към домейн). Домейнът обаче може да се третира като DTO (тъй като класът винаги е негов родител), така че обратното преобразуване не е необходимо; просто предайте класа на домейна в хранилището, където би очаквал DTO.

person KeithS    schedule 21.01.2011
comment
Да, моят план е да предам домейн клас директно към/от хранилище. Така че няма DTO, нито истински POCO, за да бъдем точни. ... Консенсусът от всички дискусии, които прочетох, изглежда показва, че NHibernate не е толкова лесен за настройка. Така че смятам, че това е преждевременно и за мен. :) Но е добре. Целта ми с въпроса е да знам какви решения са възможни. Така че това е добра информация за мен! - person bretddog; 21.01.2011
comment
NHibernate наистина не е толкова лош; основното му увеличение в сложността е, че изисква набор от съпоставяния на обект/схема, за разлика от Linq2SQL, който просто изисква диаграма на схема, за която генерира DTO. Конфигурирането на NHibernate за определена DB, предвид необходимите съпоставяния, е доста просто. - person KeithS; 22.01.2011
comment
Да, сега разгледах някои примери за NHibernate. И поне на повърхността изглежда по-лесно, отколкото си мислех. Чувствам се като правилната стъпка, така че ще я пробвам. - person bretddog; 22.01.2011

Преди да създадете своите съпоставяния ръчно, погледнете AutoMapper

AutoMapper е обектно-обектно картографиране. Картографирането обект-обект работи чрез трансформиране на входен обект от един тип в изходен обект от различен тип. Това, което прави AutoMapper интересен, е, че предоставя някои интересни конвенции, за да премахне мръсната работа от измислянето как да картографирате тип A към тип B. Докато тип B следва установената конвенция на AutoMapper, е необходима почти нулева конфигурация за картографиране на два типа.

person stuartd    schedule 21.01.2011
comment
Благодаря! Може би това е страхотно. Но за мен изглежда малко лоша документация. Мисля, че за моето ниво това ще създаде допълнителни главоболия и проблеми.. - person bretddog; 21.01.2011