Vous pouvez coder mais cela fonctionnalité vous-même. Par exemple, voici un ASP.NET MVC FilterAttributeFilterProvider, utilisé pour injecter des propriétés sur des filtres d'action d'attribut.
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);
}
}
}
}
}
Dans la méthode BuildUpAttributeDependancies, nous recherchons des propriétés un-initialisés (null), puis vérifiez si le type a été enregistré avec le château de Windsor. Si c'est le cas, nous définissons la propriété. En remplaçant FilterAttributeFilterProvider par défaut par notre filtre personnalisé (ci-dessus) dans le fichier global.asax, nous pouvons désormais utiliser les fonctionnalités Castle Windsors DI pour injecter n'importe quel type sur n'importe quel filtre d'action dans notre application MVC. Pour compléter cette réponse complète, voici un exemple d'une classe d'application global.asax avec l'installation du château de Windsor pour les deux Controller (au moment de l'instanciation) et ActionFilter (au temps d'utilisation) injection de dépendance:
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();
}
}
double: http://stackoverflow.com/questions/447193/resolving-classes-without-registering-them-using-castle-windsor http://stackoverflow.com/questions/851940/windsor-castle-injecting-properties-of-constructed-object –