Brad Wilson 有一个很好的关于服务位置的系列,其中包括如何创建自己的支持依赖注入的过滤器提供程序:http: //bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html(向下滚动到“向过滤器添加依赖注入”部分)。
- 复制他为 UnityFilterAttributeFilterProvider.cs 提供的代码。
UnitFilterAttributeFilterProvider.cs
using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.Practices.Unity;
public class UnityFilterAttributeFilterProvider : FilterAttributeFilterProvider {
private IUnityContainer _container;
public UnityFilterAttributeFilterProvider(IUnityContainer container) {
_container = container;
}
protected override IEnumerable<FilterAttribute> GetControllerAttributes(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor) {
var attributes = base.GetControllerAttributes(controllerContext,
actionDescriptor);
foreach (var attribute in attributes) {
_container.BuildUp(attribute.GetType(), attribute);
}
return attributes;
}
protected override IEnumerable<FilterAttribute> GetActionAttributes(
ControllerContext controllerContext,
ActionDescriptor actionDescriptor) {
var attributes = base.GetActionAttributes(controllerContext,
actionDescriptor);
foreach (var attribute in attributes) {
_container.BuildUp(attribute.GetType(), attribute);
}
return attributes;
}
}
- 修改 global.asax.cs 的 Application_Start 以使 UnityFilterAttributeFilterProvider 成为 MVC 应用程序的过滤器提供程序。
.
protected void Application_Start() {
// ...
var oldProvider = FilterProviders.Providers.Single(
f => f is FilterAttributeFilterProvider
);
FilterProviders.Providers.Remove(oldProvider);
var container = new UnityContainer();
var provider = new UnityFilterAttributeFilterProvider(container);
FilterProviders.Providers.Add(provider);
// ...
}
- 使用 [Dependency] 属性装饰您希望 Unity 为其注入值的属性。然后你应该很高兴。