Призма - Unity эквивалент функциональности MEF? - PullRequest
1 голос
/ 04 апреля 2011

У меня есть решение, структурированное так:

  • Сборка моделей
  • Сборка данных - определяет интерфейсы репозитория и базовый класс репозитория
  • Сборка ORM - реализует репозиторийинтерфейсы и наследует базовый класс репозитория ^
  • Бизнес-сборка - содержит ссылку на сборку данных и динамически извлекает объект ORM через MEF (без явной ссылки на сборку ORM)
  • сборка пользовательского интерфейса(s)

Таким образом, я могу легко заменить ORM, если мы решим заняться чем-то другим.

Мне интересно, возможно ли иметь подобную функциональностьс единством.Я хочу отделить свою бизнес-логику от базового ORM.Из того, что я прочитал, единство в основном работает во время компиляции, а MEF во время выполнения.При этом можно ли отделить единое целое таким образом, чтобы у моего бизнес-уровня не было ссылок на ORM, а были только интерфейсы, которые он реализует из сборки данных?Как Unity может определить, что реализует интерфейс без ссылки на реализующую сборку?

В настоящее время в MEF ни одна сборка не имеет ссылки на ORM (кроме случаев, когда бизнес-уровень динамически вытягивает его во время выполнения дляобнаружить детали и заполнить интерфейс объектом).Я бы предпочел продолжить работу в этом направлении и хотел бы знать, смогу ли я сделать это с Unity.

1 Ответ

1 голос
/ 04 апреля 2011

Чтобы сделать то же самое с Unity, у вас обычно есть интерфейсы ORM и их реализация в отдельных сборках.

Например, в сборке Project.Orm.Interface вы должны определить интерфейсы, которые должен реализовывать любой ORM;остальная часть вашего решения будет иметь ссылки на Project.Orm.Interface.Таким образом, ни одна часть вашего приложения не имеет ссылок на какую-либо конкретную реализацию ORM.

Сборка Project.Orm.ConcreteImplementation также будет ссылаться на Project.Orm.Interface и регистрировать конкретные типы в контейнере, используя реализуемые ими типы интерфейсов (очень похожезависимый код разрешает типы, запрашивая интерфейсы, которые они реализуют).

В контексте Prism будет динамически обнаруженный IModule, который загружает Project.Orm.ConcreteImplementation и регистрируетвводит в контейнер во время инициализации модуля.

...