Внедрение репозитория в ActionFilter - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь вставить хранилище в фильтр действий, но получаю следующую ошибку:

Произошло необработанное исключение при обработке запроса. InvalidOperationException: невозможно разрешить службу для типа «... ISqlRepository» при попытке активации '... MyActionFilterAttribute'.

Я пытаюсь следовать примеру Стива Смита из здесь . Все работает нормально, пока я не добавлю ссылку ISqlRepository в конструктор.

Вот соответствующие биты кода:

Startup.cs

services.AddScoped<MyActionFilterAttribute>();

MyActionFilterAttribute.cs (я понимаю, что я реализую IResultFilter здесь. Я просто пытаюсь придерживаться как можно ближе к примеру).

public class MyActionFilterAttribute: IResultFilter
    {
        private ILogger _logger;
        private ISqlRepository _sql;
        public MyActionFilterAttribute(ILoggerFactory loggerFactory, ISqlRepository sql)
        {
            _logger = loggerFactory.CreateLogger<LoaderActionFilterAttribute>();
            _sql = sql;
        }

MyController.cs

[Route("api/[controller]")]
    [ServiceFilter(typeof(MyActionFilterAttribute))]
    public class MyController: Controller

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вам нужно зарегистрировать свой репозиторий, как обычно, в ioC:

services.AddScoped<ISqlRepository,SqlRepository>();

Тогда вам нужно будет сделать property injection для атрибута.

Похоже на это -

public class MyActionFilterAttribute: IResultFilter
{
    public static Func<ISqlRepository> GetSqlRepo;

    private ISqlRepository _sql;

    public MyActionFilterAttribute()
    {
        _sql = GetSqlRepo();
    }
}

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

`MyActionFilterAttribute.GetSqlRepo = () => services.GetService<ISqlRepository>()`
0 голосов
/ 05 апреля 2019

Вам необходимо добавить ISqlRepository к вашим услугам:

services.AddScoped<ISqlRepository,SqlRepository>();

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

...