Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用IOC容器的WCF属性注入_Wcf_Inversion Of Control_Castle Windsor_Custom Attributes_Wcffacility - Fatal编程技术网

使用IOC容器的WCF属性注入

使用IOC容器的WCF属性注入,wcf,inversion-of-control,castle-windsor,custom-attributes,wcffacility,Wcf,Inversion Of Control,Castle Windsor,Custom Attributes,Wcffacility,使用ASP.NET MVC,我可以同样替换FilterProvider var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider); FilterProviders.Providers.Remove(oldProvider); FilterProviders.Providers.Add(new CustomFilterProvider(_container));

使用ASP.NET MVC,我可以同样替换FilterProvider

 var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
 FilterProviders.Providers.Remove(oldProvider);
 FilterProviders.Providers.Add(new CustomFilterProvider(_container));
使用我自己的自定义提供程序。它没有让我能够使用工厂模式来创建控制器过滤器属性,但我确实能够使用属性注入来设置属性使用容器可能需要的依赖项

是否可以使用WCF做类似的事情,以便我可以将依赖项(属性注入很好)注入到我的用户定义类中,这些类派生自我在服务方法上使用的类(服务是使用IOC创建的)


我正在使用Castlewindsor的WcfFacility,但是一个通用的解决方案(适用于任何容器)可能是一个更好的答案。

一种方法是使用containers OnCreate方法或类似方法,并在注册时执行以下操作

  Container.Register(Component.For<IMyService>().ImplementedBy<MyService>().OnCreate(WireUpAttibutes).LifeStyle.Transient);
Container.Register(Component.For().ImplementedBy().OnCreate(WireUpAttibutes.LifeStyle.Transient);
然后有以下方法

  private static void WireUpAttibutes<T>(IKernel kernel, T instance) {
     var attributes = instance.GetType().GetCustomAttributes(typeof(MyAttribute), false);
     foreach (var attribute in attributes) {
        WireUp(kernel, attribute.GetType(), attribute);
     }
  }

  private static void WireUp(IKernel kernel, Type type, object instance) {
     var properties = type.GetProperties().Where(p => p.CanWrite && p.PropertyType.IsPublic);
     foreach (var propertyInfo in properties.Where(propertyInfo => kernel.HasComponent(propertyInfo.PropertyType))) {
        propertyInfo.SetValue(instance, kernel.Resolve(propertyInfo.PropertyType), null);
     }
  }
私有静态void WireUpAttibutes(IKernel内核,T实例){
var attributes=instance.GetType().GetCustomAttributes(typeof(MyAttribute),false);
foreach(属性中的var属性){
WireUp(内核,attribute.GetType(),属性);
}
}
私有静态void WireUp(IKernel内核、类型、对象实例){
var properties=type.GetProperties()。其中(p=>p.CanWrite&&p.PropertyType.IsPublic);
foreach(properties.Where(propertyInfo=>kernel.HasComponent(propertyInfo.PropertyType))中的var propertyInfo){
SetValue(实例,kernel.Resolve(propertyInfo.PropertyType),null);
}
}