asp.net параметр конструктора внедрения зависимости mvc ядра - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь понять внедрение зависимостей в ASP.NET MVC CORE.

Все примеры одинаковы, они показывают для регистрации HttpContextAccessor

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

Тогда класс, который хочет получить к нему доступ:

public class UserService : IUserService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public UserService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public bool IsUserLoggedIn()
    {
        var context = _httpContextAccessor.HttpContext;
        return context.User.Identities.Any(x => x.IsAuthenticated);
    }
}

Но тогда, когдая на самом деле хочу создать экземпляр UserService, он запрашивает объект httpContextAccessor в конструкторе, где я могу получить это от?

Ответы [ 2 ]

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

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

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

services.AddScoped<IMyService, MyService>();

затем

class MyConsumerClass
{
    private readonly IMyService _myService;
    MyConsumerclass(IMyService myService)
    {
         _myService = myService;
    }
}

Таким образом, вам не нужно заботиться о том, какие услугинеобходимо инициализировать (параметризовать) в вашем конструкторе.

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

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

Как правило, поток в ASP.NET Core для кода вашего приложения запускается в контроллере.Поэтому, если вы хотите использовать UserService внутри действия контроллера, вы должны внедрить его в контроллер:

public class ExampleController : Controller
{
    private readonly IUserService _userService;

    public ExampleController(IUserService userService)
    {
        _userService = userService;
    }

    public IActionResult Index()
    {
        var isLoggedIn = _userService.IsUserLoggedIn();

        // …

        return View();
    }
}

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

Вам просто нужно обязательно зарегистрировать службу внутри ConfigureServices:

services.AddTransient<IUserService, UserService>();

Этот принцип действует независимо от того, гдевы находитесь в вашей заявке.Поскольку точка входа всегда создается системой, вы всегда находитесь внутри контекста внедрения зависимостей, поэтому вы можете просто зависеть от вещей, которые сами имеют зависимости (которые также могут иметь больше зависимостей и т. Д.).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...