dotnet core-вход в библиотеку классов - PullRequest
0 голосов
/ 31 мая 2019

возможно ли использовать 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;
    }
}

1 Ответ

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

Взято из предыдущего ответа :

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

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

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

Чтобы использовать это в контроллере, проверьте официальные документы , вам просто нужно добавить свои зависимости в конструктор и выиграть !, в основном две части:

Добавьте в свой 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 знает, что загружать.

Если вы хотите, чтобы ваш код был чистым, вы можете использовать метод Extension, чтобы сгруппировать все ваши объявления и просто вызвать services.AddMyAwesomeLibrary(), например:

В вашем удивительном библиотечном проекте:

public static class MyAwesomeLibraryExtensions
{
    public static void AddMyAwesomeLibrary(this IServiceCollection services)
    {
        services.AddSingleton<SomeSingleton>();
        services.AddTransient<SomeTransientService>();
    }
}

А в твоем стартапе

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddMyAwesomeLibrary();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...