stevenjin 2024-11-07 20:31 采纳率: 96.8%
浏览 5
已结题

asp.net core mvc 属性过滤器注入失败

asp.net core mvc 注入到属性过滤器中的类(_product)为空

   public class Product{}

//1.program中注册
  builder.Services.AddSingleton<Product >();

//2.编写属性过滤器
 

    public class Licy : Attribute, IActionFilter
    {     
        private Product _product;

        public void OnActionExecuted(ActionExecutedContext context, Product product)
        {
            _product= product;
        }

      public void OnActionExecuting(ActionExecutingContext context)
      {
        var p=    _product;//使用时为空
      }
}

//3.使用过滤器
       [TypeFilter(typeof(Licy))]
       [Authorize(Roles = "2")]
       public async Task<IActionResult> SetInfo()
       {}
}
  • 写回答

1条回答 默认 最新

  • 越重天 新星创作者: Java技术领域 2024-11-08 22:23
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 问题分析
      • 在你的代码中,虽然在Program.cs中注册了Product类为单例服务,但是在属性过滤器Licy中并没有正确地注入Product实例。在OnActionExecuted方法中,参数product的传递方式是不正确的,并且在OnActionExecuting方法中,_product为空是因为没有正确的注入机制。
    2. 解决方案
      • 正确的注入方式
        • 首先,修改Licy类的构造函数来接受Product实例的注入。
      • 以下是修正后的代码:
    public class Product { }
    
    // 在Program.cs中注册(假设这是在.NET 6及以上版本中的注册方式)
    // builder.Services.AddSingleton<Product>();
    
    // 编写属性过滤器
    public class Licy : Attribute, IActionFilter
    {
        private Product _product;
    
        public Licy(Product product)
        {
            _product = product;
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // 这里不需要再接收product参数,因为已经在构造函数中注入了
        }
    
        public void OnActionExecuting(ActionExecutingContext context)
        {
            var p = _product;
        }
    }
    
    // 使用过滤器
    // 在需要使用的地方,确保正确地获取服务提供者并注入Product实例
    // 假设在控制器中使用,以下是一种可能的方式(如果是在.NET 6及以上版本)
    public class YourController : Controller
    {
        private readonly Product _product;
    
        public YourController(Product product)
        {
            _product = product;
        }
    
        [TypeFilter(typeof(Licy), Arguments = new object[] { null })]
        [Authorize(Roles = "2")]
        public async Task<IActionResult> SetInfo()
        {
            return View();
        }
    }
    
    • 在上述修正后的代码中:

      • Licy类中添加了一个构造函数,该构造函数接受Product实例。这样,在创建Licy过滤器实例时,Product实例就可以被正确注入。
      • 在控制器YourController中,通过构造函数注入Product实例,然后在[TypeFilter]特性中,将null作为参数传递(这里的null会被替换为实际注入的Product实例,这是TypeFilter的工作机制)。
    • 注意事项

      • 如果是在较旧版本的ASP.NET Core中,Program.cs中的服务注册方式和在控制器中获取服务的方式可能会有所不同,但基本的注入原理是相似的。例如,在旧版本中可能需要使用IServiceProvider来手动解析服务实例等操作。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月11日
  • 已采纳回答 11月11日
  • 修改了问题 11月8日
  • 修改了问题 11月7日
  • 展开全部