2017-10-17 56 views
0

我知道,与常规的过滤器,你可以传递参数,像这样:是否可以传递服务过滤器参数?

[Filter(param="value")] 
public ActionResult Action() 
{ 
    return View(); 
} 

public class Filter : ActionFilterAttribute 
{ 
    public string param { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // do something with your parameter... 
    }  
} 

我有一个服务过滤:

// MyCustomFilter.cs  
namespace MyNamespace.Filters 
{ 
    public class MyCustomFilter : ActionFilterAttribute 
    { 
     public string param { get; set; } 

     // The services I'm injecting. 
     private ILogger _logger; 
     private IM3ObjectRepository _repo; 

     public MyCustomFilter(ILogger<MyCustomFilter> logger, IM3ObjectRepository repo) 
     { 
      _logger = logger; 
      _repo = repo; 
     } 

     public override void OnActionExecuting(ActionExecutingContext ctx) 
     { 
      _logger.LogInformation("Filter is working."); 

      // Get stuff from object repository, based on passed-in parameter. 
     } 
    } 
} 

// Startup.cs 
public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    services.AddSingleton<IM3ObjectRepository, M3ObjectRepository>(); 

    services.AddScoped<M3UISecurityFilter>(); 

    ... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    loggerFactory.AddSerilog(); 

    ... 
} 

// Example of filter being used. 
[ServiceFilter(typeof(MyCustomFilter))] 
public IActionResult Action(...) 
{ 
    ... 
} 

该过滤器注入到它的一些服务。但每次使用该服务时,我也会发送一个参数。

我将如何实现传递参数?我无法在网上找到任何描述如何与常规过滤器类似的操作。服务过滤器甚至可能吗?

回答

1

只是试图把它扩大

public class CustomServiceFilterAttribute : ServiceFilterAttribute 
{ 
    public string Param { get; set; } 

    public CustomServiceFilterAttribute(Type type) 
     : base(type) 
    { 

    } 
} 

,并使用

[CustomServiceFilterAttribute(typeof(BaseHttpService), Param = "value")] 
+0

我用更多的代码编辑了这个问题。 当我尝试了你的建议时,编译器抱怨主构造函数(_There没有给出对应于'ServiceFilterAttribute.ServiceFilterAttribute(Type)'的必需形式参数'类型'的参数)以及** OnActionExecuting **方法(_MyCustomFilter.OnActionExecuting(ActionExecutingContext)':找不到合适的方法override_)。 –

0

我已经找到一种替代方案:

// MyCustomFilter.cs 
public class MyCustomFilter : ActionFilterAttribute 
{ 
    public string param { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext ctx) 
    { 
     ILogger<MyCustomFilter> logger = (ILogger <MyCustomFilter>)ctx.HttpContext.RequestServices.GetService(typeof(ILogger<MyCustomFilter>)); 
     IM3ObjectRepository repo = (IM3ObjectRepository)ctx.HttpContext.RequestServices.GetService(typeof(IM3ObjectRepository)); 

     logger.LogInformation("Filter is working."); 

     // Get stuff from object repository, based on passed-in parameter. 
    } 
} 

// Example of filter being used. 
[MyCustomFilter(param = "value you want")] 
public IActionResult Action(...) 
{ 
    ... 
} 

而不是注入我的需要,我想查询服务他们。

我现在可以设置和访问我需要的参数。

我不会将此标记为答案,因为它不回答原始问题。但它确实提供了一种替代解决方案。

注:添加自定义过滤器的服务Startup.cs当然不再需要。在那里使用的服务(例如,在这种情况下是对象库和记录器)当然仍然是必需的。

相关问题