Как внедрить IHostingEnvironment в моем собственном классе - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть код ниже для создания файла журнала.

public class LoggingService
{
    private readonly IHostingEnvironment env;

    public LoggingService(IHostingEnvironment env)
    {
            this.env = env;
    }

    public void WriteLog(string strLog)
    {
            //Some code is Here
    }
}

После Доступ к классу в функции контроллера

LoggingService log =  new LoggingService();
log.WriteLog("Inside GetUserbyCredential function");

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

Не указан аргумент, соответствующий необходимому формальному параметру 'env' из 'LoggingService.LoggingService (IHostingEnvironment)'

Как создать экземпляр для этого.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

DependencyInjection в .NET Core требует, чтобы вы зарегистрировали свои классы и их зависимости, чтобы он мог создавать / извлекать любые зависимости перед созданием экземпляра вашего класса.

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

Прежде всего, вам нужно зарегистрировать свой LoggingService с IServiceCollection в startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<LoggingService>();

    services.AddMvc();
}

Служба DI сообщает, что когда класс запрашивает LoggingService в своем конструкторе, он должен создать экземпляр этого класса.За кулисами .NET Core уже зарегистрировал интерфейс IHostingEnvironment со службой DI, поэтому нам не нужно об этом беспокоиться.Когда службе DI необходимо создать экземпляр нашей LoggingService, она автоматически внедрит зависимость IHostingEnvironment.

Теперь нам нужно внедрить класс в наш контроллер:

public class ValuesController : Controller
{
    private readonly LoggingService _loggingService;

    public ValuesController(LoggingService loggingService)
    {
        _loggingService = loggingService;
    }

    ...
}

Когда .NET Core создает экземпляр нашего ValuesController, он увидит, знает ли он, как создать экземпляр LoggingService - что делает, потому что мы рассказали ему о нашем классе в startup.cs.

OneЧто нужно помнить о Dependency Injection, вы почти всегда НИКОГДА не используете new для создания класса.(Есть исключения из этого, но вы должны всегда пытаться позволить службе DI создавать классы без использования ключевого слова new.

Я предлагаю вам потратить некоторое время на чтение документации Внедрение зависимостей , поэтому вы полностью понимаете, как работает внедрение зависимостей в ASP.NET Core и различных доступных областях.

0 голосов
/ 15 декабря 2018

Проблема в следующей строке:

LoggingService log =  new LoggingService();

Когда вы создаете экземпляр класса LoggingService, вы не передаете IHostingEnvironment его конструктору, и поэтому он становится нулевым.

Чтобы преодолеть эту проблему, попробуйте следующее:

public interface ILoggingService
{
   void WriteLog(string strLog);
}

public class LoggingService : ILoggingService
{

    private readonly IHostingEnvironment env;

    public LoggingService(IHostingEnvironment env)
    {
        this.env = env;
    }
    public void WriteLog(string strLog)
    {

        //Some code is Here
    }
}

Затем в вашем контроллере:

public class YourController : Controller
{
     private readonly ILoggingService _loggingService;
     public YourController(ILoggingService loggingService)
     {
         _loggingService = loggingService;
     }

     public IActionResult YourMethod()
     {
        _loggingService.WriteLog("Inside GetUserbyCredential function");
     }
}

Наконец, в методе ConfigureServices класса Startup, как показано ниже:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<ILoggingService, LoggingService>();
}
...