2015-04-21 4 views
1

У меня есть пара общих интерфейсов и реализаций в общей сборке инфраструктуры. Примеры:Назначить реализацию на основе сборки

AlphaRepository<T> : IRepository<T> 
BetaRepository<T> : IRepository<T> 

Я работаю над модульной архитектурой, поэтому каждая подсистема имеет свою собственную сборку, которая использует эту общую библиотеку. Каждый репозиторий имеет конструктор, который принимает IDbContext. Каждая подсистема реализует и расширяет IDbContext. Можно ли через StructureMap, чтобы сделать что-то вдоль линий:.

  • Для монтажа А, В (TYPEOF (IRepository <>)) Используйте (TypeOf (AlphaRepository <>)), использование AlphaContext для IDbContext.
  • для сборки B, для (TYPEOF (IRepository <>)). Используйте (TypeOf (BetaRepository <>)), используйте
    BetaContext для IDbContext

Я хотел бы разделить их в различных регистрах как (т.е. AlphaRegistry и BetaRegistry). Все они будут подключены в статическом классе IoC, где инициализируется контейнер.

Мысли?

UPDATE (в ответ на вопрос Стивена):

Не обязательно; Я создал их достаточно гибкими, чтобы либо делиться базой данных, либо использовать отдельные базы данных. Они оба используют базовый DbContext: IDbContext. Проблема в том, что AlphaUnitOfWork принимает AlphaContext и передает это на базу EfUnitOfWork как IDbContext. Проблема заключается в том, чтобы указать структуру структуры для использования AlphaContext при работе в сборке Alpha и BetaContext при использовании классов сборки Beta. Как работа вокруг (в данном случае), я набрал IDbContext и использовал синтаксис Forward>(). Работая до сих пор, но я хотел бы сделать это с другими классами (например, реализация ILogger на основе сборки вызовов, которую Alpha может хранить в БД, а бета-версия может хранить в NoSQL), без необходимости генерировать их.

+0

Делают ли 'AlphaContext' и' BetaContext' точку в той же базе данных или, по крайней мере, указывают на базу данных с помощью той же схемы базы данных? – Steven

+0

Обновленный исходный вопрос, потому что мой ответ был слишком длинным. Спасибо, Стивен! – mtm927

+1

Если 'AlphaRepository ' ломается, когда вводится контекст BetaContext, вы нарушаете [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle), и это корень вашей проблемы. Вместо этого дайте каждому контексту собственную абстракцию и пусть каждый репозиторий зависит от этой абстракции или напрямую зависит от конкретного типа. Это решает проблему LSP и полностью решает проблемы с регистрацией. – Steven

ответ

0

Независимо от действительной точки, что Стивен поднял, я думаю, вы можете решить эту проблему по следующим направлениям ...

В данном реестре вы зарегистрировать DbContext и Repository именованных экземпляры с именем так же, как название Ассамблеи. Проблема с этим может заключаться в том, что именование не работает с открытыми универсальными определениями, что я не могу проверить прямо сейчас.

Для ввода данных в соответствующие потребители вы должны затем настроить, какой именованный экземпляр использовать для некоторого заданного аргумента ctor. Вы получите имя из сборки типа, который вы просто настраиваете.

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