Как зарегистрировать один и тот же экземпляр (= singleton) для 2 интерфейсов в призме IContainerRegistry - PullRequest
1 голос
/ 24 сентября 2019

У меня есть приложение Prism, с Unity для внедрения зависимостей.

У меня есть один класс со следующим наследованием:

ISomeService --> ISomeMoreSpecializedService --> SomeMoreSpecializedService
  • ISomeService используется в некоторых модулях, не относящихся к приложениям.
  • ISomeMoreSpecializedService расширяет этот предыдущий интерфейс, добавляя некоторую концепцию, специфичную для приложений
  • SomeMoreSpecializedService - единственная реализация, которая должнаиспользоваться в определенном программном обеспечении
  • (есть также абстрактная реализация ISomeService)

Мой специализированный сервис выглядит так:

public class SomeMoreSpecializedService : SomeService, ISomeMoreSpecializedService
{
    public SomeMoreSpecializedService(ISomeDependency dependency){
    }
}

Яв модуле Prism:

public class MyModule : IModule
{
    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterSingleton<ISomeService, SomeMoreSpecializedService>();
        containerRegistry.RegisterSingleton<ISomeMoreSpecializedService, SomeMoreSpecializedService>();
    }

    public void OnInitialized(IContainerProvider containerProvider)
    {
    }
}

Но моя проблема в том, что я получаю тогда 2 разных синглтона.Как мне это сделать?

До того, как я построил new SomeMoreSpecializedService(), а затем делал RegisterInstance.Это работало до сих пор, но теперь у меня есть некоторая зависимость для инъекций.

1 Ответ

1 голос
/ 24 сентября 2019

С Unity вы делаете

containerRegistry.RegisterSingleton<FactoryController>();
containerRegistry.Register<IFactoryController, FactoryController>();
containerRegistry.Register<IFactoryToken, FactoryController>();

, то есть ContainerControlledLifetimeManager для типа без каких-либо интерфейсов, а затем присоединяете тип к двум интерфейсам без указанного менеджера времени жизни.

К сожалению,поведение IContainerRegistry.Register и IContainerRegistry.RegisterSingleton в основном не определено, и они просто пропускают поведение нижележащего контейнера.Так что это сработает, если Unity не изменит свое поведение (как это было в прошлом) или вы не переключитесь на другой контейнер.

...