2010-11-08 141 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(); 
    } 
}