ただし、この機能を自分でコーディングすることはできます。たとえば、属性アクションフィルタにプロプライティを挿入するために使用されるASP.NET MVC FilterAttributeFilterProviderを次に示します。 BuildUpAttributeDependancies法で
public class AttributeFilterProvider : FilterAttributeFilterProvider
{
public AttributeFilterProvider(IKernel kernel)
{
_kernel = kernel;
}
private readonly IKernel _kernel;
protected override IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor);
BuildUpAttributeDependancies(attributes);
return attributes;
}
protected override IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var attributes = base.GetActionAttributes(controllerContext, actionDescriptor);
BuildUpAttributeDependancies(attributes);
return attributes;
}
private void BuildUpAttributeDependancies(IEnumerable<FilterAttribute> attributes)
{
foreach (var attribute in attributes)
{
var propInfos = attribute.GetType().GetProperties().Where(x => x.GetValue(attribute) == null).AsEnumerable();
foreach (var pi in propInfos)
{
if (_kernel.HasComponent(pi.PropertyType))
{
var service = _kernel.Resolve(pi.PropertyType);
pi.SetValue(attribute, service);
}
}
}
}
}
、我々は非初期化(ヌル)のプロパティを探して、その後、型は城ウィンザーに登録されているかどうかを確認します。それがあった場合は、プロパティを設定します。
デフォルトのFilterAttributeFilterProviderをglobal.asaxファイルのカスタム(上記)に置き換えることで、Castle Windsors DIの機能を使用して、MVCアプリケーションの任意のアクションフィルタに任意のタイプを挿入できるようになりました。
public class MvcApplication : System.Web.HttpApplication
{
private static IWindsorContainer _container;
private static void BootstrapContainer()
{
_container = new WindsorContainer()
.Install(FromAssembly.This());
var controllerFactory = new ControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
}
private static void BootstrapFilters()
{
var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
FilterProviders.Providers.Remove(oldProvider);
var provider = new AttributeFilterProvider(_container.Kernel);
FilterProviders.Providers.Add(provider);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
BootstrapContainer();
BootstrapFilters();
}
}
[解決の可能性の重複:完全にこの答えを完了するために、ここで依存性の注入(使用時)コントローラ(インスタンス化時)とのActionFilterの両方のための城ウィンザーのセットアップでのGlobal.asaxアプリケーションクラスの一例ですクラスを登録せずにCastle Windsorを使用してください(http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor) –
これは 'container.BuildUp' Unityの機能を使用して、http://stackoverflow.com/questions/851940/windsor-castle-injecting-properties-of-constructed-objectを複製しますか? – mookid8000
Jeez。どのように私は既存の質問を探しても、何も見つからないのですか?ああ、リンクのおかげで、重複して申し訳ありません。 –