Использование ExportAttribute
, хотя ваш полный источник только для регистрации всех ваших типов звучит как нарушение принципа инверсии зависимостей. Это само по себе сомнительно, но у него есть несколько недостатков.
Простой инжектор не нуждается в использовании атрибутов для поиска классов, которые вы хотите зарегистрировать. На самом деле это один из design principles экипажа простого инжектора.
Вы можете легко (ну и легко ... в зависимости от вашего текущего дизайна) ... удалить атрибут, если вы будете следовать принципам SOLID для ваших режимов просмотра (и соответствующих представлений).
Если мы возьмем типичное приложение LOB, где мы имеем кучу объектов в базе данных, мы могли бы разделить наш дизайн ViewModel/представления в этих общих интерфейсах, которые ваши ViewModels будут осуществлять (по одному Offcourse):
//for a typical datagrid view of your entities with e.g. Add, Edit and Delete button
IWorkspace<TEntity>;
//for a typical edit view for one entity (including possible child entities)
IEditEntity<TEntity>;
//for choosing a specific foreign entity type from your edit view
//e.g. your editing an order and need to specify the customer
IChooseEntity<TEntity>
Используя эти методы, мы получим очень конкретные модели просмотра, которые являются SOLID и которые по-прежнему могут быть скомпонованы для очень большого сложного представления для пользователя, если хотите.
Вы можете очень легко зарегистрировать эти типы с простым Injector использованием batch registration так:
container.RegisterManyForOpenGeneric(
typeof(IChooseEntityViewModel<>), Assembly.GetExecutingAssembly());
В качестве бонуса этой конструкции вы можете обернуть ваши ViewModels с одним или несколькими декораторами, которые могут быть использованы для некоторых реальных MVVM, например, найти свой вид, привязать его к модели просмотра и показать вид в окне/странице и т. Д. Если вы хотите больше узнать о декораторах, в сочетании с простым инжектором, вы можете найти интересные статьи here (не забывайте, различные ссылки).
Я получил экспорт работать, но каждый раз, когда я пытаюсь разрешить зависимость в моем коде с Ioc.Get я получил «IoC не инициализирован» ... Я использую в своем коде много IoC.Get . В моем коде я переопределяю методы GetInstance, BuildUp, GetAllInstances согласно http://www.cshandler.com/2013/03/basics-of-caliburn-micro-with-simple.html –
advapi
@advapi не стесняйтесь публиковать сообщения эта проблема возникает как еще один вопрос с вашим кодом, и мы будем более чем рады помочь ... – qujck