Получить Сервис и использовать его в каком-то произвольном классе в сетевом ядре - PullRequest
0 голосов
/ 31 мая 2019

Есть множество примеров, как настроить контроллеры на использование сервисов и т. Д. Но как насчет простого старого класса?Давайте воспользуемся простой службой конфигурации

JSON

{
  ....,
  "AppSettings": {
    "SchemaFile": "some file name.xml"
  }  
}

POCO

public class AppSettings
{
    public string SchemaFile { get;set; }
}

В файле startup.cs

public void ConfigureServices(IServiceCollection services)
{
    IConfigurationSection appSettingsSection = Configuration.GetSection("AppSettings");
    services.Configure<AppSettings>(appSettingsSection);
  . . . . 
}

Это точка, в которойвсе примеры перемещаются непосредственно к контроллеру.Но у нас будет много кода вне контроллера.Мне нужно получить доступ к этому сервису, используя provider.GetService(typeof(T)) или provider.GetRequiredService(typeof(T)), скажем, статический класс

internal static MyClass
{
    internal static void DosomeThing()
    {
        // acquire my service
        // use it to retrieve some value
        // continue with my logic

    }
}

Спасибо

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Так же, как сервисы могут быть внедрены в контроллеры, так же как они могут быть внедрены в другие классы.

статические классы, однако, не подходят для внедрения зависимостей по умолчанию.

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

internal class MyClass : IMyService {
    readonly AppSettings settings;

    public MyClass(AppSettings settings) {
        this.settings = settings;
    }

    internal void DosomeThing() {
        // retrieve some value from settings
        // continue with my logic
    }
}

Затем вы можете зарегистрировать желаемое POCO и утилиты в контейнере службы

public void ConfigureServices(IServiceCollection services) {
    AppSettings appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
    services.AddSingleton(appSettings);
    services.AddSingleton<IMyService, MyClass>();
    //. . . . 
}

Внедрите свой сервис там, где это необходимо, и он будет иметь доступ к POCO, когда будет разрешен для инъекций.

На самом деле нет необходимости передавать IServiceProvider, так как это может быть воспринято как запах кода.

Упрощение вашего проекта в соответствии с принципом явной зависимости должно сделать ваш код более НАДЕЖНЫМ, а также упростить отслеживание и поддержку.

0 голосов
/ 31 мая 2019

Вы должны передать AppSettings как параметр из метода вызывающей стороны

public class HomeController : Controller
{
   public HomeController(AppSettings settings)
   {
      this.Settings = settings;
   }

   private AppSettings Settings { get; }

   public IActionResult Index()
   {
      MyClass.DosomeThing(this.Settings);
   }
}

internal static MyClass
{
    internal static void DosomeThing(AppSettings settings)
    {
        // acquire my service
        // use it to retrieve some value
        // continue with my logic

    }
}
...