Autofac - Внедрение свойств в фильтр действий в ядре ASP.NET - PullRequest
0 голосов
/ 14 октября 2018

При кодировании приложения с использованием ASP.NET Web API 2 Мне удалось добиться Инъекции свойства на уровне фильтра с использованием Autofac .

(приведенный ниже пример относится к неосновному веб-API ASP.NET)

builder.Register(x => new MyCustomGlobalActionFilter())
    .AsWebApiActionFilterOverrideFor<MyCustomController>()
    .InstancePerRequest()
    .PropertiesAutowired();

Несколько замечаний:

  • мы должны зарегистрировать его для любогоКонтроллер выглядит так: .AsWebApiActionFilterOverrideFor<MyCustomController>()
  • следующий бит используется для включения Внедрение свойства : .PropertiesAutowired()

Сам фильтр действия выглядит немного необычно, так какПока он тесно связан с Autofac - мы реализуем интерфейс IAutofacActionFilter.

Затем я могу разрешать службы на уровне фильтра с помощью внедрения свойства, вот пример кода:

public class MyCustomGlobalActionFilter : IAutofacActionFilter
{
    public Session Session { get; set; }
    public DbContextWithUserAuditing DbContext { get; set; }
    public ITenantService TenantService { get; set; }

    public Task OnActionExecutingAsync(
        HttpActionContext actionContext, 
        CancellationToken cancellationToken
        )
    {
        string userId = null;
        int? tenantId = null;

        var claimsIdentity = actionContext.RequestContext.Principal as ClaimsPrincipal;

        // do some stuff

        return Task.FromResult(0);
    }

    public Task OnActionExecutedAsync(
        HttpActionExecutedContext actionExecutedContext,
        CancellationToken cancellationToken
        )
    {
        return Task.FromResult(0);
    }
}

Итак, по порядкучтобы разрешить службы в качестве свойств, мы просто объявляем их следующим образом:

public Session Session { get; set; }
public DbContextWithUserAuditing DbContext { get; set; }
public ITenantService TenantService { get; set; }

Мой вопрос: Есть ли способ разрешить службы путем внедрения свойств в фильтр с использованием Autofac в ASP.NET Core?

1 Ответ

0 голосов
/ 20 октября 2018

Что ж, на самом деле это не отвечает на мой вопрос, однако некоторые люди могут найти его полезным.

Вместо того, чтобы следовать подходу Локатор служб , с фильтром в ASP.NET Core выможет в значительной степени использовать Внедрение зависимостей .

Наслаждайтесь!

public class MyCustomFilter : IAsyncActionFilter
{
    private Session _session;
    private DBContextWithUserAuditing _dbContext;
    private ITenantService _tenantService;

    public MyCustomFilter(
        Session session,
        DBContextWithUserAuditing dbContext,
        ITenantService tenantService
        )
    {
        _session = session;
        _dbContext = dbContext;
        _tenantService = tenantService;
    }

    public async Task OnActionExecutionAsync(
        ActionExecutingContext context,
        ActionExecutionDelegate next
        )
    {
        string userId = null;
        int? tenantId = null;

        // do stuff
        // ...

        var resultContext = await next();
    }
}

Решена основная дилемма - мы не используем Сервисный локатор вминимум.

ИМХО, Внедрение свойства не очень важно, поэтому я понимаю, почему команда Autofac не торопится его реализовывать.

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