그러나이 기능을 직접 코딩 할 수 있습니다. 예를 들어, 다음은 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);
}
}
}
}
}
, 우리는 초기화되지 않은 (NULL) 특성을 찾아 다음 유형 성 윈저에 등록되어 있는지 확인한다. 있다면 우리는 속성을 설정합니다.
기본 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에 응용 프로그램 클래스의 예입니다, 완전히이 답변을 완료하려면 클래스 캐슬 윈저를 사용하여 그들을 등록하지 않고 (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. 어떻게 기존의 질문을 찾고, 찾지 못했습니까? 결국 6 명이 내게 자신을 키울 때 중복 된 것을 보여 줍니까? 오, 링크에 감사드립니다. 복제본에 대해 유감스럽게 생각합니다. –