2009-11-03 1 views
1

Я регистрация несколько модулей в моем приложении Prism с помощью UnityBootstrapperКак разрешить типы, зарегистрированные в других модулях в Призме?

protected override IModuleCatalog GetModuleCatalog() 
{ 
    var catalog = new ModuleCatalog(); 
    catalog 
     .AddModule(typeof(LoginModule)) 
     .AddModule(typeof(AppModule)) 
     .AddModule(typeof(DataTransformationModule), InitializationMode.OnDemand) 
     .AddModule(typeof(SyncModule), InitializationMode.OnDemand); 

    return catalog; 
} 

Позже я загружаю эти модули, которые устанавливаются для загрузки OnDemand динамически в ответ на действия пользователя. Хотя мне удалось загрузить модули OnDemand из других модулей, типы, зарегистрированные в модулях загрузки OnDemand, не получили разрешения.

public class SyncModule : IModule 
{ 
    private readonly IUnityContainer container; 

    public SyncModule(IUnityContainer container) 
    { 
     this.container = container; 
    } 

    public void Initialize() 
    { 
     this.RegisterViewsAndServices(); 

     ISyncController controller = this.container.Resolve<ISyncController>(); 
     controller.Run(); 
    } 

    protected void RegisterViewsAndServices() 
    { 
     this.container.RegisterType<ISyncController, SyncController>(); 
     this.container.RegisterType<ISyncAnchorsRepository, SyncAnchorsRepository>(); 
     this.container.RegisterType<ISyncService, SyncService>(); 
     this.container.RegisterType<IView, SynchronizeView>("SynchronizeView"); 
     this.container.RegisterType<IView, SyncTrayView>("SyncTrayView"); 
    } 
} 

При попытке загрузить любой из типов, зарегистрированных в SyncModule (как показано выше), из другого модуля компилятор генерирует ResolutionFailedException, поскольку каждый модуль. Нужно ли в любом случае вводить один экземпляр IUnityContainer во все модули? (Это будет злоупотребление призмой?)

ответ

0

Моя ошибка. Я использовал Type.GetType без полного имени сборки для динамической загрузки типов из других модулей. Типы, зарегистрированные в контейнере Unity из модулей, доступны для разрешения в другом месте.

+1

Вы должны 1) всегда показывать нам свой реальный код 2) не использовать Type.GetType для любого из этого. Если у вас есть типы, которые необходимо использовать для разных модулей, эти модули имеют общую библиотеку. Обычно я называю это сборкой «Контракты». Если вы используете что-то вроде ISyncService, просто выполните singleContainer.Resolve (), а не (что я думаю, что вы делаете) unitContainer.Resolve (Type.GetType («SyncModule.ISyncService, SyncModule»)); –

+0

Привет Андерсон, не могли бы вы взглянуть на этот вопрос: http://stackoverflow.com/questions/1678423/what-is-the-best-method-to-load-views-dynamically-from-a-navigation- control-in-pr Я разработал сценарий, в котором я использую GetType() с образцом кода. – Raj

1

Посмотрите полное сообщение ResolutionFailedException. Несмотря на несколько криминальный характер, он обычно содержит подробную информацию о том, что не удалось. Обычно это исключение возникает для проблемы не для самого типа, который разрешается сам, а для одной из зависимостей, введенных через параметры конструктора.

+0

Я могу разрешить эти типы без каких-либо проблем с модуля, который был зарегистрирован в контейнере. Я получаю это исключение в других модулях. – Raj

+0

Он говорит, что вам нужно посмотреть на внутренние исключения, чтобы убедиться, что вы смотрите на ошибку REAL. В качестве альтернативы вы можете использовать ExceptionExtensions.GetRootException (исключение), чтобы получить исключение root, а не содержащую ошибку разрешения. –