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);
// ...
}
- Unityに値を注入するプロパティを[Dependency]属性で装飾します。そして、あなたは行ってもいいはずです。