代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

在prism中,如何将接口注入模块构造器而不是类型?

  •  0
  • Edward Tanguay  · 技术社区  · 16 年前

    在我的Prism应用程序中,我得到了错误 尝试获取CustomerModule类型的实例时发生激活错误,键\“\” .

    这是因为我的 客户模块 我想给一个“男人管理者”注射 信息管理器 :

    namespace CustomerModule
    {
        public class CustomerModule : IModule
        {
            private readonly IRegionManager regionManager;
            private readonly IUnityContainer container;
            private readonly IMenuManager menuManager;
    
            public CustomerModule(IUnityContainer container, 
                IRegionManager regionManager, 
                IMenuManager menuManager)
            {
                this.container = container;
                this.regionManager = regionManager;
                this.menuManager = menuManager;
            }
    
            public void Initialize()
            {
    
                container.RegisterType<IMenuManager, MenuManager>(new ContainerControlledLifetimeManager());
            ...
    

    但是,如果我更改customermodle构造函数以插入 改为类型 接口的, 然后它工作 :

    public CustomerModule(IUnityContainer container, 
        IRegionManager regionManager, 
        MenuManager menuManager)
    

    那么,我需要在哪里将我的menumanager注册为实现menumanager呢? 在customermodule的initialize方法中注册它似乎太迟了。

    答:

    我把它放在configureContainer()中,它工作得很好,一定要放在“base.configureContainer()”中:

    protected override void ConfigureContainer()
    {
        base.ConfigureContainer();
        Container.RegisterType<MenuManager>(new ContainerControlledLifetimeManager());
    }
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Anderson Imes    16 年前

    为什么你会在你注册的同一个模块中要求一个menumanager?

    除非您真的认为您的menumanager应该是由外部模块提供的,否则如果您的模块依赖于它,您可能会考虑将这个注册放在引导程序中。这将是您在引导程序的configureContainer方法中放置的东西。

        2
  •  1
  •   Andy Clarke    16 年前

    正如您可能意识到的那样,这是因为构造函数在初始化方法之前被调用。

    两种解决方案是:

    1)在shell项目中有一个shellbootstrapper类,该类的方法在程序加载时调用。

    让引导程序中的方法注册与容器的任何global接口。

    2)或者将IMenuManager从构造函数中取出,并在注册之后解决它。

    public void Initialize()
    {
        container.RegisterType<IMenuManager, MenuManager>(new ContainerControlledLifetimeManager());
        this.menuManager = container.Resolve<IMenuManager>();
    }
    

    希望这有帮助!