0

使用 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 创建的)?

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

4

1 回答 1

1

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

  Container.Register(Component.For<IMyService>().ImplementedBy<MyService>().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);
     }
  }
于 2012-05-25T06:24:19.007 回答