В нашем проекте мы реализовали простое средство, позволяющее одной стороне публиковать динамические компоненты, а третьим - использовать их. Я хотел бы свернуть нашу внутреннюю реализацию и взять что-то готовое с полки. Поскольку наши ребята из UI уже используют Caliburn + Prism + Unity, я решил использовать Unity (кажется, странно делать две разные реализации контейнера IoC).
Ради вопроса вот игроки:
- Типы сущностей (
A
, B
)
- Предприятия предприятий (
FactoryA
, FactoryB
)
- Менеджер сущностей (
Manager
)
- Клиент
На данный момент Manager
имеет RegisterFactory(IFactory)
API, который является единственным способом регистрации новых типов сущностей - его необходимо вызывать, передавая новый экземпляр фабрики сущностей.
Однако явные вызовы этого метода со стороны клиента редки, потому что Manager
запускает наш внутренний движок, который проверяет все сборки в определенной папке и загружает те, которые объявляют определенный атрибут уровня сборки. Атрибут указывает тип конкретной фабрики сущностей, так что механизм может создать его экземпляр (используя Activator.CreateInstance
) и вызвать API RegisterFactory
.
Кроме того, движок контролирует папку и знает, как загружать новые сборки на лету.
Например, если C - это новый тип сущности, реализованный в сборке Foo.dll, тогда сборка должна иметь атрибут уровня сборки, например:
[assembly: PublishEntity(typeof(FactoryC))]
Затем размещение Foo.dll в этой специальной папке приводит к тому, что движок:
- проверьте его и найдите там соответствующий экземпляр атрибута уровня сборки
- Создать новый
FactoryC
экземпляр, используя отражение
- Вызвать
Manager.RegisterFactory
, передав в качестве аргумента экземпляр FactoryC
.
Дело в том, что я хочу использовать Unity для достижения той же функциональности.
Есть идеи?
Спасибо.
EDIT
Требуются оба типа: Manager и Factory. То, что мне интересно исключить, - это специальное средство регистрации - атрибут, метод RegisterFactory и механизм, который сканирует папку и загружает соответствующие сборки. Теперь я понимаю, что единства может быть недостаточно. Мне интересно узнать о бесплатных решениях, которые удовлетворят наши потребности. Я просто хочу использовать что-то хорошо известное и проверенное, желательно что-то, что стремится быть стандартом.