【ASP.NET MVC | Autofac 小筆記】Asp.net MVC 5 ActionFilter DI 問題

【ASP.NET MVC | Autofac 小筆記】Asp.net MVC 5 ActionFilter DI 問題
相信很多人都用過autofac這套DI工具,而DI在一開始時總是會有一個建構式,讓DI工具可以注入實體物件,減少系統的藕荷程度!所以一般程式碼都會類似像以下的程式碼
而今天,饅頭想要在Controller中加上一些Filter來做權限的控制,若依照剛剛的範例寫法我們的Filter應該要是這樣子

相信很多人都用過autofac這套DI工具,而DI在一開始時總是會有一個建構式,讓DI工具可以注入實體物件,減少系統的藕荷程度!所以一般程式碼都會類似像以下的程式碼


public class MenuController : Controller
{
    private IMenuService service;

    public MenuController(IMenuService injection)
    {
        this.service = injection;
    }
}

而今天,饅頭想要在Controller中加上一些Filter來做權限的控制,若依照剛剛的範例寫法我們的Filter應該要是這樣子

 


public class FilterAttribute :ActionFilterAttribute
{
    private IMyService service;
    public FilterAttribute(IMyService injection)
    {
        this.service = injection;
    }
}

在Controller中使用的時候,卻要我們注入一個實體,否則就會一直出錯,因為在Filter一開始時要求我們要輸入實體類別,無法讓DI工具幫我們注入

1

2

這樣,該如何是好呢?後來到了Autofac的網站上找找看,有沒有人跟我一樣遇到這樣的問題,在Google大神的幫助下,看到這一篇文章的介紹,文章中有個章節Inject Properties Into FilterAttributes,原來Autofac可以利用"屬性"的方式來注入實體!

網站的範例程式碼很簡單,饅頭也一樣的做了一次後卻發現出錯了...

原因是因為饅頭今天要注入的東西是UnitOfWork,中間還有一個資料庫的調度物件在UnitOfWork中等待注入

後來,測試了幾個Method後,終於找到了對的大門了!


builder.RegisterType(typeof(UnitOfWork)).As(typeof(IUnitOfWork)).PropertiesAutowired().InstancePerRequest();
builder.RegisterFilterProvider();

沒錯,PropertiesAutowired就是這一個!

饅頭的Filter也改成了


 public class PermissionAttribute : ActionFilterAttribute
 {
     public IUnitOfWork Repostiroies { get; set; }
 }

如此一來就可以在Filter中也使用DI了!

 


參考資料

https://code.google.com/p/autofac/wiki/MvcIntegration

 


 

大家好我是饅頭,希望大家喜歡我的文章

如果有錯誤的地方請不吝指教 ^_^