Что такое преобразование MVVM-призмы в SimpleIoc.Default.GetInstance? - PullRequest
0 голосов
/ 22 февраля 2019

Я довольно новичок в MVVM PPRISM и переписываю проект, использующий MVVMLight SimpleIOC.У меня есть следующие строки кода при регистрации в MVVM Light, и я сомневаюсь, что это правильный способ конвертировать его в DryIOC MVVM Prims.

SimpleIoc.Default.Register< iClassA, ClassA >();
SimpleIoc.Default.Register< iClassB, ClassB >();
// The factory method is necessary to prevent the linker from removing the class A constructor
SimpleIoc.Default.Register<IClassC>(() => new ClassC(SimpleIoc.Default.GetInstance<IClassA>(), SimpleIoc.Default.GetInstance<IClassB>()));

Мой вопрос: containerRegistry.GetContainer().Resolve<IClassInterface>() правильный способконвертировать из SimpleIoc.Default.GetInstance< IClassInterface >()

containerRegistry.Register<iClassA, ClassA>();
containerRegistry.Register<iClassB, ClassB>();
containerRegistry.RegisterInstance<ClassC>(new ClassC((iClassA)containerRegistry.GetContainer().Resolve<iClassA>(), (iClassB)containerRegistry.GetContainer().Resolve<iClassB >()));

1 Ответ

0 голосов
/ 22 февраля 2019

Итак, у вас здесь есть два вопроса в одном, поэтому я постараюсь ответить на каждую часть:

Преобразование из SimpleIoc в IContainerRegistry

У меня есть следующие строкикод при регистрации в MVVM Light, и я сомневаюсь, что это правильный способ конвертировать его в DryIOC MVVM Prims.

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

Например, если у вас есть:

SimpleIoc.Default.Register<iClassA, ClassA>();

Теоретически это соответствует эквиваленту:

containerRegistry.Register<iClassA, ClassA>();

Поскольку вы имеете дело со слоем абстракции, это действительноне имеет значения, был ли контейнер поддержки DryIoc, Unity или даже пользовательской реализацией с SimpleIoc.

Теперь, когда есть какой-то специфичный для контейнера API, к которому вам нужен доступ, вы всегда можете вызвать GetContainer()расширение для доступа к базовому контейнеру (при условии, что вы используете DryIoc или Unity).

Типы разрешения:

Так что если в вашем контейнере есть метод с именем Resolve, который возвращает тип, тогда да, вы можете перейтивниз к контейнеру, чтобы вызвать его, но лучший вопрос - зачем вам это?

Мой вопрос: действительно ли containerRegistry.GetContainer (). Resolve () правильный способ преобразования из SimpleIoc.Default.GetInstance ()

В случае, если вы пытаетесь разрешить что-то из IContainerRegistry, потому что вам нужна какая-то безумная инициализация.Я бы предложил использовать один из встроенных API-интерфейсов DryIoc, где у вас может быть:

containerRegistry.Register<IFoo, Foo>();
containerRegistry.GetContainer().Register<IBar>(Reuse.Singleton, 
       Made.Of(() => new BarImplementation("requiredString", Arg.Of<IFoo>()));

Здесь вы заметите, что я намеренно проигнорировал ваш пример Rp1210:

// The factory method is necessary to prevent the linker from removing the class A constructor
SimpleIoc.Default.Register<IClassC>(() => new Rp1210(SimpleIoc.Default.GetInstance<IClassA>(), SimpleIoc.Default.GetInstance<IClassB>()));

Естьдве причины, по которым я проигнорировал это ...

  1. Комментарий говорит мне, почему они это сделали .. компоновщик.Отключите связывание или обновите конфигурацию компоновщика, чтобы сохранить ctor для вашей реализации IClassA.
  2. Весь смысл использования контейнера IoC заключается в том, что он автоматически поймет, что ему нужно внедрить зарегистрированные службы.

Вы заметите, что я ссылаюсь только на этот API, специфичный для Контейнера, потому что он имел примитивное значение, которое мне нужно было ввести.

...