В Prism, как ввести интерфейс в конструктор моего модуля вместо типа? - PullRequest
0 голосов
/ 21 июля 2009

В моем приложении призмы я получаю ошибку Произошла ошибка активации при попытке получить экземпляр типа CustomerModule, ключ \ "\" .

Это связано с тем, что мой модуль клиентов Я пытаюсь внедрить "menuManager" типа IMenuManager :

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? Кажется, что регистрировать его в методе Initialize CustomerModule слишком поздно.

ОТВЕТ:

Я поместил его в ConfigureContainer (), и он работал нормально, обязательно оставьте в "base.ConfigureContainer ()":

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

Ответы [ 2 ]

3 голосов
/ 21 июля 2009

Зачем вам запрашивать MenuManager в том же модуле, в котором вы его регистрируете?

Если вы действительно не думаете, что ваш MenuManager должен быть чем-то, предоставленным внешним модулем, вы можете рассмотреть возможность размещения этой регистрации в загрузчике, если ваши модули будут зависеть от него. Это было бы чем-то, что вы бы добавили в метод ConfigureContainer вашего загрузчика.

1 голос
/ 21 июля 2009

Как вы, наверное, поняли, это потому, что конструктор вызывается перед методом инициализации.

Два решения:

1) Имейте класс ShellBootstrapper в вашем проекте Shell с методом, который вызывается при загрузке программы.

Пусть метод в загрузчике зарегистрирует любые глобальные интерфейсы с вашим контейнером.

2) Либо возьмите IMenuManager из конструктора и просто разрешите его после регистрации.

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

Надеюсь, это поможет!

...