Соглашения с БД в Fluent NHibernate - PullRequest
0 голосов
/ 28 октября 2011

У меня есть набор соглашений 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 ...

С уважением, Райан.

1 Ответ

0 голосов
/ 31 октября 2011

Обычно вы настраиваете свои соглашения (а также оставшуюся часть вашей свободной конфигурации) в исполняемом файле.

Это означает, что у вас будет другая свободная конфигурация в вашем графическом интерфейсе, модульных тестах и ​​во всем остальном, что потребляет ваши услуги на основе ISession / ISessionFactory.

Мне кажется, что вы жестко запрограммировали свою конфигурацию и теперь пытаетесь выяснить, как заставить этот "конфигуратор" работать по-разному в зависимости от некоторой информации об окружающей среде.

Гораздо более простым способом было бы создать свою конфигурацию на верхнем уровне и предоставить ее как зависимость от того, что ей нужно. Таким образом, вы не включите один и тот же путь кода из разных сред.

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

Конечно, вы все равно можете настроить любой класс, создающий конфигурацию FNH, чтобы он был сам по себе конфигурируемым, и использовать условные операторы в строках конфигурации. Но обычно в конфигурации FNH так мало строк кода, что вряд ли стоит. Просто создайте совершенно отдельные конфигурации для SQL Server, Oracle, SQLite и т. Д. Таким образом, вам не придется постоянно поддерживать его каждый раз, когда вы вносите незначительные изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...