PRISM: RegisterType с именем и ContainerControlledLifeTimeManager

У меня проблема с этим RegisterType.

container.RegisterType<IFoo, Foo>("Foo", new ContainerControlledLifetimeManager());

Каждый модуль, который я создам, будет содержать аналогичный последний регистр. Другие модули будут реализовывать Foo2, Foo3 как конкретный тип.

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

Проблема также внутри модуля, в его конструкторе в качестве параметра требуется IFoo (как я знаю, для этого нужен объект ContainerControlledLifetimeManager), и когда я устанавливаю функцию RequestNavigate и пытаюсь сгенерировать модель представления:

public class FooViewModel
{
    // here cannot create the object.
    public FooViewModel(IFoo foo, ...)
    { .. }
}

И выкидывает:

ResolutionFailedException не было обработано пользовательским кодом. Ошибка разрешения зависимости, тип = "System.Object", имя = "FooView". Исключение произошло во время: при разрешении. Исключение: InvalidOperation — текущий тип Prism4Demo.ModuleA.IFoo является интерфейсом и не может быть сконструирован. Вам не хватает типа?


person Darf Zon    schedule 10.04.2012    source источник


Ответы (2)


Вы также можете использовать DependencyOverride во время разрешения

container.Resolve<FooViewModel>(new DependencyOverride<IFoo>(container.Resolve<IFoo>("Foo")))

Или ResolvedParameter во время RegisterType.

Обновлять:

container.RegisterType<FooViewModel>(
    new InjectionConstructor(new ResolvedParameter<IFoo>("Foo")));

Вы можете использовать Resolve даже для View, а не только для ViewModel. Он автоматически разрешает зависимость для ViewModel.

regionManager.RegisterViewWithRegion(RegionNames.LeftRegion,
    () => this.container.Resolve<FooView>(new DependencyOverride<IFoo>
        (this.container.Resolve<IFoo>("Foo"))));
person AlexT    schedule 10.04.2012
comment
алекс, спасибо за ответ. Меня интересует ResolvedParameter, могу ли я увидеть пример из этого? - person Darf Zon; 11.04.2012

Есть 2 способа сделать это. Один из способов — получить контейнер, а затем разрешить экземпляр, указав параметр «Foo». Это не совсем чистый способ сделать это. Вы не ограничены только использованием контейнера DI, предоставляемого prism. Prism также содержит ServiceLocator и связан с контейнером.

Локатор службы используется только для разрешения экземпляров, и вы просто вызовете

ServiceLocator.Current.GetInstance<IFoo>("Foo");

Вам нужно добавить ссылку на Microsoft.Prism.ServiceLocation.dll

person Rik van den Berg    schedule 10.04.2012