Как использовать одноэлементный объект в глубокой иерархии классов - PullRequest
0 голосов
/ 21 марта 2019

Здравствуйте, у меня есть следующая проблема.

У меня есть объект, который создается только один раз , более конкретно, в методе ConfigureServices класса Startup.

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

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

Пример

 public void ConfigureServices(IServiceCollection services)
    {
           var dependencyObject=await Database(....get me something...);
           var singleton=new Singleton(dependencyObject);

           var userService=new SomeService(complexObject); //transient !
           services.AddTransient(userService);
    }

    public class SomeService
    {
       public SomeComponentOfService component{get;set;}
       SomeService(Singleton singleton)
       {
         component=new  SomeComponentOfService(singleton);
       }
    }

public class SomeComponentOfService
{
   public Singleton singleton;
   public SomeComponentOfService(Singleton single)
   {
      ......on and on....
    }
}

И этот список можно продолжать и продолжать с объектом Singleton....

Теперь, как вы можете видеть, моей Transient службе нужен одноэлементный объект, который зависит от другой службы (базы данных). Так что синглтон должен быть создан высоко в иерархии.

Проблема в том, что мой SomeService должен передать другим объектам в этом singleton, и есть гигантская иерархия.

Могу ли я как-то создать свой Singleton высоко в цепи и получить его от моегонабор услуг (где мне это нужно)?

1 Ответ

1 голос
/ 21 марта 2019

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

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

...