Итак, у вас здесь есть два вопроса в одном, поэтому я постараюсь ответить на каждую часть:
Преобразование из 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>()));
Естьдве причины, по которым я проигнорировал это ...
- Комментарий говорит мне, почему они это сделали .. компоновщик.Отключите связывание или обновите конфигурацию компоновщика, чтобы сохранить ctor для вашей реализации IClassA.
- Весь смысл использования контейнера IoC заключается в том, что он автоматически поймет, что ему нужно внедрить зарегистрированные службы.
Вы заметите, что я ссылаюсь только на этот API, специфичный для Контейнера, потому что он имел примитивное значение, которое мне нужно было ввести.