【问题标题】:Injecting Repository into ActionFilter将存储库注入 ActionFilter
【发布时间】:2019-04-05 14:34:13
【问题描述】:

我正在尝试将存储库注入操作过滤器,但收到以下错误:

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

我正在尝试从 here 遵循史蒂夫·史密斯的模式。在我将 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

【问题讨论】:

  • 你注册你的仓库类了吗?

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


【解决方案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>()

【讨论】:

    【解决方案2】:

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

    services.AddScoped<ISqlRepository,SqlRepository>();
    

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

    【讨论】:

    • 谢谢大家!我选择了@mxmissile 的解决方案,它似乎有效!
    • 如何在属性中获取你的 repo 实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2021-08-21
    • 2019-04-17
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多