我正在尝试将存储库注入到动作过滤器中,但是出现以下错误:
处理请求时发生未处理的异常。 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
答案 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
是通过框架添加的。