将存储库注入ActionFilter

时间:2019-04-05 14:34:14

标签: c# dependency-injection .net-core action-filter

我正在尝试将存储库注入到动作过滤器中,但是出现以下错误:

  

处理请求时发生未处理的异常。   InvalidOperationException:无法解析类型的服务   尝试激活时出现“ ... ISqlRepository”   '... MyActionFilterAttribute'。

我正在尝试遵循here中Steve Smith的模式。一切正常,直到我将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 个答案:

答案 0 :(得分:1)

您需要像通常使用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>()`

答案 1 :(得分:0)

您需要将ISqlRepository添加到您的服务中:

services.AddScoped<ISqlRepository,SqlRepository>();

所引用的示例项目不必这样做的原因是因为ILoggerFactory是通过框架添加的。

相关问题