0

たとえば、次のコードを呼び出して、ポリシーを挿入する一連のサービス全体を登録したいと思います。

container
            .AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());

どこ:

ISomeServiceA  : IBusinessService
ISomeServiceB : IBusinessService etc 

どこかで ISomeServceX から IMarkerInterface に到達できないことを読んだと思います....これは確認できます

4

1 に答える 1

0

要するに、ロードされたアセンブリを見てください (必要に応じて追加のフィルタリングを追加します - これがブートストラップで行われる場合はキャッシュしません) 指定されたマーカー インターフェイスを実装する型の既定のインターセプターを追加します。

        container.AddNewExtensionIfNotPresent<Interception>();
        Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
        foreach (Assembly assembly in assemblies)
        {
            Type[] types = assembly.GetTypes().Where(x => x.IsClass && typeof(T).IsAssignableFrom(x) && x.GetType() != typeof(T)).ToArray();
            foreach (Type t in types)
            {
                container.Configure<Interception>().SetDefaultInterceptorFor(t, new VirtualMethodInterceptor());
            }
        }

編集:

上記は流暢な API を使用して実行でき、AppDomain.CurrentDomain.GetAssemblies() への素朴な依存関係がないことを意味します (流暢な API 構成で適用されるフィルタリングは含まれません)。

.Include(If.Implements<IBusinessService>, (x, y) =>
                                                          {
                                                              if (x.IsClass)
                                                                  y.Configure<Interception>().
                                                                      SetDefaultInterceptorFor(x,
                                                                                               new VirtualMethodInterceptor
                                                                                                   ());
                                                          })
于 2012-07-31T13:21:47.007 に答える