【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工具幫我們注入
這樣,該如何是好呢?後來到了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
大家好我是饅頭,希望大家喜歡我的文章
如果有錯誤的地方請不吝指教 ^_^