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

これを行う 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 に答える