目前,我有一個自定義的ControllerFactory到我注入我統一容器:使用Unity注入依賴到定製ActionFilter
在Global.asax中的Application_Start():
var container = InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
var factory = new UnityControllerFactory(container);
ControllerBuilder.Current.SetControllerFactory(factory);
在控制器出廠設置我的控制器使用自定義ActionInvoker像這樣:
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
var controller = base.GetControllerInstance(requestContext, controllerType) as Controller;
if (controller != null)
controller.ActionInvoker = new UnityActionInvoker(_container);
return controller;
}
在我的自定義ActionInvoker
最後,我嘗試使用被調用集結行動在ActionInvokers容器:
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext,
IList<IActionFilter> filters,
ActionDescriptor actionDescriptor,
IDictionary<string, object> parameters)
{
var builtUpFilters = new List<IActionFilter>();
foreach (IActionFilter actionFilter in filters)
{
builtUpFilters.Add(_container.BuildUp<IActionFilter>(actionFilter));
}
return base.InvokeActionMethodWithFilters(controllerContext, builtUpFilters, actionDescriptor, parameters);
}
這裏是正在建立起來的ActionFilters的一個示例:
public class PopulatRolesAttribute : ActionFilterAttribute, IActionFilter
{
private const string RolesKey = "roles";
[Dependency]
public Func<IMetadataService> Service { get; set; }
public PopulatRolesAttribute()
{
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.Controller.ViewData[RolesKey] == null)
{
filterContext.Controller.ViewData[RolesKey] = Service().GetRoles();
}
}
}
的問題是,在我的自定義ActionFilterAttribute公共屬性不會與任何注射,在執行時它仍然是空的!我看不出爲什麼我的過濾器沒有被容器正確建立。被注入的類型是否正確註冊,就像這樣:
container.RegisterInstance(new ChannelFactory<IMetadataService>(
new BasicHttpBinding(),
new EndpointAddress("http://example.com/ABSApplication/MetadataService.svc")));
container.RegisterInstance<Func<IMetadataService>>(
() => container.Resolve<ChannelFactory<IMetadataService>>().CreateChannel());
而且也正在申請中其他部分注射(雖然不是通過.Buildup)。這與blog post所遵循的過程幾乎完全相同。我錯過了什麼難題?
出於好奇,爲什麼不能在說這樣做,認證要求,預認證請求等,並緩存它們(會話等),所以他們在那裏爲每個請求,而用戶登錄? –
我最初的目的是封裝這個功能,以便在行動需要時添加它。如果經過審查,我將使用過濾器檢索的數據很大一部分,我當然會將其全局緩存以便在整個應用程序中重用。無論如何,它實際上開始看起來像是一個更簡單的解決方案,無論重用!但我仍然很好奇爲什麼'container.BuildUp'不起作用。 –
我確實找到了這個樣本,很快就會檢查出來。該源代碼也可以在那裏下載http://msdn.microsoft.com/en-us/gg618494 –