0

在我的 prism 应用程序中,我在尝试获取 CustomerModule 类型的实例时收到错误 Activation error occurred, key \"\"

这是因为我的客户模块我试图注入一个 IMenuManager 类型的“ menuManager ” :

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());
        ...

但是,如果我将 CustomerModule 构造函数更改为注入类型而不是接口,那么它可以工作

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

那么我需要在哪里注册我的 MenuManager 来实现 IMenuManager?似乎在 CustomerModule 的 Initialize 方法中注册它为时已晚。

回答:

我把它放在 ConfigureContainer() 中,它工作正常,一定要留在“base.ConfigureContainer()”中:

protected override void ConfigureContainer()
{
    base.ConfigureContainer();
    Container.RegisterType<MenuManager>(new ContainerControlledLifetimeManager());
}
4

2 回答 2

3

为什么要在注册它的同一模块中要求 MenuManager?

除非您真的认为您的 MenuManager 应该是由外部模块提供的东西,否则您可能会考虑将此注册放入您的引导程序中,如果您的模块将依赖它。这将是您将其放入引导程序的 ConfigureContainer 方法中的内容。

于 2009-07-21T18:58:10.050 回答
1

您可能已经意识到这是因为构造函数在初始化方法之前被调用。

两种解决方案是:

1)在您的 Shell 项目中有一个 ShellBootstrapper 类,该类具有在程序加载时调用的方法。

让引导程序中的方法向您的容器注册任何全局接口。

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

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

希望这可以帮助!

于 2009-07-21T14:32:59.883 回答