2009-08-24 3 views
3

Я в настоящее время разрабатываю решение, где модель домена & репозиторий может быть расширена плагинами приложений. Теперь я столкнулся с несколькими проблемами, которые перечислены ниже.Расширяемая модель домена с NHibernate

  1. Моя первая проблема заключается в создании расширяемой модели домена. Я думал об использовании наследования здесь, но, честно говоря, я понятия не имею, как я могу использовать несколько модулей плагинов, расширяющих один и тот же объект домена. Я вроде бы склоняюсь к тому, чтобы сделать каждый объект домена частичным и позволить плагинам расширять его таким образом. В случае, если у меня есть несколько плагинов, расширяющих один и тот же объект домена, мне не придется беспокоиться о загрузке разных расширенных сборок доменов для каждого плагина. У меня все равно будет только один объединенный объект домена во время выполнения. Есть идеи по этому поводу?

  2. Другая проблема заключается в расширении файла сопоставления NHibernate. Я мог бы каждый файл сборки встраивать встраиваемый объект домена, который он расширяет, и мой менеджер NHibernate загружает его, а не тот, который указан в базовом домене. Еще раз, проблема в том, что если у меня есть несколько плагинов, расширяющих один и тот же объект домена. У меня может быть один файл переопределения плагинов для другого. Решение, которое я имею в последней задаче, не так велико, но я думал о включении контрольной суммы в сборку плагина в качестве сигнатуры для исходного файла сопоставления, который он использовал до его расширения. Я могу проверить эту контрольную сумму во время загрузки и загружать карту плагина только в том случае, если контрольные суммы совпадают. Довольно уродливый, но по крайней мере я не буду переопределять любые карты, которые отличаются от базовой карты, используемой для расширения в сборке плагина.

В любом случае, я хотел бы услышать, что вы, ребята, думаете об этом. Благодаря!

ответ

0

Хорошая новость заключается в том, что то, о чем вы просите, возможно и не так сложно управлять.

О плагиновском управлении вы можете взглянуть на Microsoft Prism (http://msdn.microsoft.com/fr-fr/magazine/cc785479.aspx), который представляет собой несколько приятных функций по разработке модульных приложений.

О 1. Вы можете сопоставить подклассы в отдельных сопоставлениях в отдельных сборках, ищите документацию по NH. Отдельный файл сопоставления для подкласса выглядит так:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <subclass name="YourClassFullName, YourPluginAssemblyName" 
      extends="YourParentClassFullName, TheAssemblyWhereYourBaseClassIsDefined" 
      discriminator-value="whateveryouwant"> 
    ... add your subclass mapping here ... 
    </subclass> 
</hibernate-mapping> 

О себе 2. Вы можете сохранить картографию основного домена. Проще было бы создать службу (скажем, IMappingLoader), которую ваши плагины могут использовать для регистрации дополнительных сопоставлений (без переопределения сопоставления базового класса). Ваша реализация этой службы добавит ваше сопоставление в класс NH Configuration. Например, в Microsoft Prism все ваши плагины должны реализовать интерфейс IModule, который вызывается функцией Initialize() при ее загрузке. Эта функция является идеальным местом для вызова вашего сервиса IMappingLoader.

Надеюсь, это помогло.

+0

Спасибо! Я помню короткое чтение об атрибуте подкласса, но я никогда не думал об этом. Способность делать это в NH определенно делает вещи намного легче, чем я думал. – 2009-08-24 20:09:59

0

Чтобы получить расширяемую модель домена, я буду использовать множество заводов. Заводы могут быть заменены в/в путем инъекции зависимостей, а объекты домена должны быть закодированы против интерфейсов.

Отображение может выполняться, например, с помощью Fluent NHibernate, и они могут быть в этом плагине.

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

Смежные вопросы