2010-11-08 8 views
3

Castle Windsor dispose-t-il d'un équivalent de BuildUp() de Unity, dans lequel vous pouvez décorer les propriétés de classe avec des attributs et faire en sorte que le conteneur transmette des valeurs à une instance d'objet existante?Castle Windsor BuildUp

par exemple. dans l'unité:

Statistics existingInstance = new Statistics(); 
container.BuildUp(existingInstance) 

class Statistics 
{ 
    [Dependency] 
    public ICalculator Calculator { get; set; } 
+0

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 –

Répondre

1

ressemble la réponse est que le château de Windsor ne peut pas injecter des dépendances dans une instance d'objet existant soit par attributs ou une méthode d'injection:

Duplication Question

3

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(); 
    } 
} 
Questions connexes