Зарегистрируйте и отмените регистрацию услуг в Dryioc

Я создаю приложение в Xamarin.Forms, используя Prism.Forms. Он неплохо работает с Unity IOC. Поскольку в Unity отсутствуют некоторые функции, я хочу перейти на Dryioc.

Поскольку компоненты (например, страницы) приложения меняются во время выполнения, мне нужно динамически регистрировать и отменять регистрацию этих компонентов. Как это сделать в Dryioc? Кажется возможным использовать Container.OpenScope (), но этот подход создает новый контейнер, который не может использоваться Prism. Prism создает и использует один контейнер на протяжении всего срока службы приложения. Я прав?

Так есть ли другое решение?


person raV720    schedule 19.12.2018    source источник


Ответы (1)


Кажется возможным использовать Container.OpenScope ()

Нет, DryIoc не разделяет регистрации между областями действия, они всегда попадают в корневой контейнер.

Вы можете повторно зарегистрировать новую службу, передав параметр IfAlreadyRegistered.Replace. Чтобы это работало, вам также необходимо изменить как старую, так и новую регистрацию, чтобы использовать Setup.With(asResolutionCall: true). Вот почему.

Начальная настройка:

container.Register<MyServiceUser>();
container.Register<IService, MyService>(
    setup: Setup.With(asResolutionCall: true));

Замена IService:

container.Register<IService, MyReplacementService>(
    ifAlreadyRegistered: IfAlreadyRegistered.Replace,
    setup: Setup.With(asResolutionCall: true));
person dadhi    schedule 19.12.2018
comment
Спасибо! При использовании OpenScope () возможно ли разрешение также из корневого контейнера? Судя по моим тестам, это невозможно. Также возможно ли делегировать разрешение моей собственной фабрике, если контейнер не может разрешить? - person raV720; 20.12.2018
comment
При использовании OpenScope () возможно ли разрешение также из корневого контейнера? да, это возможно - нужно посмотреть, что у вас не работает. Также возможно ли делегировать разрешение моей собственной фабрике, если контейнер не может разрешить? Да, например container = container.With(rules => rules.WithUnknownServiceResolvers(req => req.ServiceType != typeof(MyType) ? null : new DelegateFactory(_ => new MyType()))); - person dadhi; 20.12.2018
comment
var main = new Container (); main.Register ‹IFoo, Foo1› (повторное использование: Reuse.Scoped); используя (var child = main.OpenScope ()) {var childFoo = child.Resolve ‹IFoo› (); var mainFoo = main.Resolve ‹IFoo› (); Assert.AreEqual (childFoo, mainFoo); } throws: Текущая область видимости недоступна. Спасибо за WithUnknownServiceResolvers, все работает. Я не могу найти информацию об этом в документации. Также ничего о WithDynamicRegistrations, что тоже кажется хорошим решением. - person raV720; 20.12.2018
comment
Вот несколько: bitbucket.org/dadhi/dryioc/wiki/ - person dadhi; 20.12.2018
comment
Для использования main для разрешения службы с ограниченной областью действия вам понадобится что-то вроде окружающего (не привязанного к контейнеру) контекста области: bitbucket.org/dadhi/dryioc/wiki/ - person dadhi; 20.12.2018