можно ли использовать Microsoft.Extensions.Logging, например, использовать ведение журнала в контроллерах (поместить конструктор и фреймворк обработать его с помощью DI), в библиотеке классов, в которой мое веб-приложение ASP.NET Core использует эту библиотеку? и как создать экземпляр класса и использовать метод?
public class MyMathCalculator
{
private readonly ILogger<MyMathCalculator> logger;
public MyMathCalculator(ILogger<MyMathCalculator> logger)
{
this.logger = logger;
}
public int Fact(int n)
{
//logger.LogInformation($"Fact({n}) called.");
if (n == 0)
{
return 1;
}
return Fact(n - 1) * n;
}
}
Да можно, а что вы пробовали?
@ rekiem87 обновил вопрос, моя проблема в том, как создать экземпляр класса.
Взято из предыдущий ответ:
... Это магия внедрения зависимостей, просто позвольте системе создать объект для вас, вам просто нужно запросить тип.
Это также большая тема, ... в основном, все, что вам нужно сделать, это определить классы как зависимости, поэтому, когда вы запрашиваете их, система сама проверяет зависимости и зависимости этих объектов, пока не разрешит все проблемы. дерево зависимостей.
При этом, если вам нужна еще одна последняя зависимость в вашем классе, вы можете добавить ее напрямую, но вам не нужно изменять все классы, использующие этот класс.
Чтобы использовать это в контроллере, пожалуйста, проверить официальные документы, вам просто нужно добавить свои зависимости в конструктор и выиграть!, в основном две части:
Добавьте в свой Startup.class
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<MySpecialClassWithDependencies>();
...
}
Затем в вашем контроллере:
public class HomeController : Controller
{
private readonly MySpecialClassWithDependencies _mySpecialClassWithDependencies;
public HomeController(MySpecialClassWithDependencies mySpecialClassWithDependencies)
{
_mySpecialClassWithDependencies = mySpecialClassWithDependencies;
}
public IActionResult Index()
{
// Now i can use my object here, the framework already initialized for me!
return View();
}
Это не должно быть другим, если ваш библиотечный класс находится в другом проекте, в конце дня вы добавите класс в автозагрузку, поэтому asp net знает, что загружать.
Если вы хотите, чтобы ваш код был чистым, вы можете использовать метод расширения, чтобы сгруппировать все ваши объявления и просто вызов services.AddMyAwesomeLibrary()
, например:
В вашем awesomeLibraryProject:
public static class MyAwesomeLibraryExtensions
{
public static void AddMyAwesomeLibrary(this IServiceCollection services)
{
services.AddSingleton<SomeSingleton>();
services.AddTransient<SomeTransientService>();
}
}
И в вашем стартапе
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMyAwesomeLibrary();
}
Фуу, да, просто опечатка
конечно, почему бы и нет?.