DB канкрэтныя канвенцыі ў Fluent NHibernate

У мяне ёсць набор пагадненняў Fluent NHibernate большасць з якіх залежыць ад базы дадзеных. Тым не менш, ёсць некалькі, якія з'яўляюцца СКБД залежыць такія адзін для радковых уласцівасцяў:

Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply
    instance.CustomSqlType("VARCHAR2(50 BYTE)")
End Sub

На самай справе я проста выкарыстоўваць канвенцыі як гэты для генерацыі БД (г.зн. аб'екты першага развіцця). Гэта працуе ўсё добра для Oracle, але я тады хачу зрабіць модульнае тэставанне з выкарыстаннем БД SQLite у памяці і, відавочна, гэта пагадненне не будзе працаваць, так як SQLite не мае тыпу VARCHAR2.

Хто-небудзь ёсць добрыя парады або спасылкі на тое, як яны наладзіць Fluent NHibernate ў такіх абставінах.

На дадзены момант я маю на ўвазе ўздоўж ліній, якія маюць агульны набор пагадненняў, якія залежаць ад базы дадзеных, а затым з залежнымі з іх у субе дырэкторыі/імёнах. Я б тады нейкі канфігурацыі, што дазваляе мне пазначыць карыстацкі кампанент ITypeSource, які б забраць усе агульныя пагаднення, а таксама тыя, якія звязаны з канкрэтнымі СКБД напрыклад SqlConventionTypeSource, OracleConventionTypeSource ...

З найлепшымі пажаданнямі, Раян.

0

1 адказы

Як правіла, вы стварылі свае дамовы (а таксама астатнюю частку вашай збеглай канфігурацыі) у выкананым файле.

Гэта азначае, што вы будзеце мець розную канфігурацыю свабодна ў вашым GUI, модульныя тэсты, і ўсё астатняе, што здараецца, спажываючы свой ISession / ISessionFactory на аснове паслуг.

Гэта гучыць для мяне, як вы жорстка закадаваныя канфігурацыю і цяпер спрабуюць высветліць, як атрымаць, што «канфігуратар» дзейнічаць па-рознаму ў залежнасці ад некаторай інфармацыі пра навакольнае асяроддзе.

Нашмат прасцей за ўсё было б стварыць сваю канфігурацыю на вышэйшым узроўні і даць яго ў якасці залежнасці да таго, што ў ёй мае патрэбу. Такім чынам, вы не ўціснуць у той жа шляху кода з розных асяроддзяў.

Незалежна ад таго, што залежыць ад NHibernate, ўсталюйце яго, каб прыняць ISession або ISessionFactory у якасці аргументу канструктара ці ўласцівасцяў сетэра. Тады вы не будзеце мець гэтую праблему. Вы нават можаце здзекавацца яго для выпрабаванняў, якія на самай справе не трэба запытваць сховішча дадзеных.

Вядома, вы ўсё яшчэ можаце наладзіць любы клас стварае FNH канфігурацыі, каб быць наладжвальным ў сабе, і выкарыстоўваць ўмоўныя аператары ў канфігурацыі ліній. Але, як правіла, канфігурацыі FNH так некалькі радкоў кода, каб пачаць з таго, што не мае сэнсу. Проста стварыць зусім асобныя канфігурацыі для SQL Server, Oracle, SQLite і г.д. Такім чынам, вы не павінны пастаянна падтрымліваць яго кожны раз, калі вы зробіце нязначныя змены.

0
дададзена
@Ryan: Здаецца, што гэта павінна быць не праблема, калі вы выкарыстоўваеце ін'екцыі залежнасцяў. Вы на самой справе з дапамогай IoC ўпырснуць, ці вы спадзявацца на нейкім одноплодной/шаблон сэрвісу-лакатар? Вы павінны быць у стане стварыць розныя ISessionManager рэалізацыі спецыяльна для выпрабаванняў, і перадаць, каб усё, што трэба праверыць.
дададзена аўтар Aaronaught, крыніца
Дзякуй за адказ Aaronaught.
дададзена аўтар Ryan.Bartsch, крыніца
FYI; Я выкарыстоўваю бібліятэку Castle.Facilities.NHibernateIntegration наладзіць NHibernate з Віндзор IoC. Такім чынам, усе мае паслугі/дакладчыкі, якія выкарыстоўваюць NHibernate могуць быць створаны з дапамогай ISessionManager як патрабуецца/факультатыўны залежнасці класа. Калі я вырашаю паслугу, Віндзор будзе ўводзіць канкрэтную рэалізацыю ISessionManager. У прынцыпе, я сапраўды не трэба занадта турбавацца аб кіраванні сеансам (напрыклад, з адкрытымі сеансамі кожнага запыту) з выкарыстаннем аб'екта і дазваляе мне зрабіць добрае модульнае тэставанне бушаля насмешлівага ISessionManager.
дададзена аўтар Ryan.Bartsch, крыніца
Я магу змяніць канфігурацыю па змаўчанні сеансу завода праз інтэрфейс аб'ектаў IConfigurationBuilder, дзе я наладзіць сесійны завод NHibernate свабодна выкарыстоўваючы аўтаматычнае адлюстраванне з канвенцыямі. Мне трэба сказаць FNH AutoPersistenceModel дзе знайсці пагадненне, якія з'яўляюцца добрымі кандыдатамі для паўторнага выкарыстання улічваючы, што яны досыць складаныя, добра вызначаны, і наўрад ці калі-небудзь зменіцца. Гэта вяртаецца да майго першапачатковага пытанні, у выніку чаго некаторыя з маіх канвенцый з'яўляюцца DB спецыфічнымі (г.зн. тыя, якія выкарыстоўваюцца для стварэння схемы).
дададзена аўтар Ryan.Bartsch, крыніца