2

在ASP.NET MVC的核心項目,需要依賴考慮一個簡單的動作過濾器:可能從ASP.NET Core項目中的Simple Injector注入IAsyncActionFilter?

public class TestActionFilter : IAsyncActionFilter { 
    private readonly IMyDependency _dep; 

    public class TestActionFilter(IMyDependency dep) 
    { 
     _dep = dep; 
    } 

    public async Task OnActionExecutionAsync(ActionExecutingContext context, 
              ActionExecutionDelegate next) 
    { 
     // do things with _dep... 
     await next(); 
    } 
} 

我已經有IMyDependency用簡單的注射器和其他地方工作的註冊。我希望Simple Injector也能處理動作過濾器。

如果我爲相同類型添加IServiceCollection註冊,它會注入到操作過濾器中。我不想要兩個綁定,但我試圖避免框架容器,並堅持使用簡單注入器。

是否有一些技巧讓簡單注射器來處理我的動作過濾器?我記得在舊的Simple Injector化身中曾有過某種「過濾器提供者」的概念,允許這樣做。

回答

5

此時,ASP.NET Core MVC的Simple Injector集成包中沒有任何內容簡化了使用過濾器屬性的工作。我們還在爲hoping微軟將添加簡化框架以支持非構造函數(因爲微軟答應make integration as smooth as it can be),但這似乎是lost cause

有幾個解決方案。一種方法是交叉佈線,就像你已經做過的那樣。但是,越多交叉線越多,您將控制移出Simple Injector的次數越多,並且您失去Simple Injector提供的驗證功能的次數越多。當所有的對象圖都是單例時,這通常不會成爲問題,但這是一個不同的討論。

另一種選擇是在內置配置系統中創建一個代理過濾器,該代理過濾器委託從Simple Injector中解析出的實際過濾器。

public sealed class SimpleInjectiorAsyncActionFilterProxy<TAsyncActionFilter> 
    : IAsyncActionFilter 
    where TAsyncActionFilter : class, IAsyncActionFilter { 
    private readonly Container container; 
    public SimpleInjectiorAsyncActionFilterProxy(Container container) { 
     this.container = container; 
    } 

    public async Task OnActionExecutionAsync(
     ActionExecutingContext c, ActionExecutionDelegate n) => 
     container.GetInstance<TAsyncActionFilter>().OnActionExecutionAsync(c, n); 
} 

這是您使用這個代理是如何掛鉤的過濾器:

container.Register<TestActionFilter>(); 

services.AddMvc(options => 
{ 
    options.Filters.Add(
     new SimpleInjectiorAsyncActionFilterProxy<TestActionFilter>(container)); 
}); 

這偉大工程全局過濾器,代理可以被定義如下。當涉及到控制器或動作範圍的過濾器時,請看passive attributes

+0

感謝您的幫助。我過於複雜的事情和被動屬性是我真正想要的。 – kenchilada

相關問題