2010-11-08 90 views
3

Castle Windsor是否具有与Unity的BuildUp()相当的功能,您可以使用属性装饰类属性并让容器将值传递给现有对象实例?Castle Windsor BuildUp

例如在Unity:

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

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

重复: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 – 2010-11-08 18:44:17

回答

1

貌似答案是温莎城堡不能依赖注入已有的对象实例或者通过属性或注射法:

Duplication Question

3

但是,您可以这个代码功能你自己。例如,下面是一个ASP.NET MVC FilterAttributeFilterProvider,用于将属性注入属性操作过滤器。

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); 
      } 
     } 
     } 
    } 
    } 

在BuildUpAttributeDependancies方法,我们寻找未初始化(空)的属性,然后检查是否类型已经与温莎城堡注册。如果有,我们设置属性。

通过与我们的自定义的(上图)在Global.asax文件替换默认FilterAttributeFilterProvider我们现在可以使用城堡温莎DI特性注入任何类型的到我们的MVC应用程序中的任何操作过滤器。要全面完成这个答案,这里是温莎城堡设置两个控制器(在实例化时)和ActionFilter(在使用时间)扶养注入一个Global.asax应用程序类的一个实例:

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