助けてくれるすべての人へ、
私は Unity コンテナーを初めて使用し、傍受を使用して特定のインターフェイスを含むコレクションをフィルター処理する方法に着手しています。インターセプトの適用は、AutoFac と Castle の経験がある私にとっては初めてのことです。ただし、実行できることはわかっていますが、インターセプターが発砲しない理由を理解するのに苦労しています。
基本的に、目標は、ログインしているユーザーのセキュリティ レベルに基づいてオブジェクトのコレクションをフィルター処理することです。このインターフェイスはISecableという名前が付けられており、その実装者はMinSecurityLevelのプロパティを持っている必要があります。残念ながら、コード ベースの大部分はインターフェイスに対してプログラミングされていないため、このインターフェイスは新しいものです。そのため、このインターフェースの実装者を使用するコレクションがいくつかあります。
Customer[] Customers { get; set; }
List<Order> Orders { get; set; }
Orders と Customers がISecableを実装する場所。
そのため、 ISecurableを実装するオブジェクトを含む各コレクションを見つけて、ログインしているユーザーのセキュリティ レベルに基づいてそれらのコレクションをフィルター処理するのではなく (これは維持するのが怪物になり、ユーザーのログインしているセキュリティ レベルを取得するのが厄介になります)。ISecableのオブジェクトを含む任意のコレクションをインターセプトすることは、コードを 1 つの中央の場所にタブで留めながら、この要件を満たすシンプルでエレガントな方法であると考えました。
そうすることで、インターセプトを開始するためのベースラインを得るために、インターネットの記事とサンプル コードを精査しました。残念ながら、実りあると証明されたものは何もありません。
私はここのポスターと同じ船に乗っているようです: Unity Interception - Custom Interception Behavior
残念ながら、彼/彼女が CallHandler および/または InterceptionBehavior 実装者を接続してコレクションのフィルタリングを開始する方法を知りません (さらに、コードベースはインターフェイス、つまり IList に対してプログラミングされており、私のコードベースは具体的な型の配列に依存しています)およびリスト)。
これは、私が試したコードのバージョンです (Handler または InterceptionBehavior クラスのプロパティまたはメソッドを起動するロックはありません)。
container.AddNewExtension<Interception>();
container.RegisterType<SecurityHandler>();
container.RegisterType<IEnumerable<ISecurable>, Customer[]>(
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<SecurableInterceptionBehavior>());
container.RegisterType<IEnumerable<ISecurable>, List<Order>>(
new Interceptor<TransparentProxyInterceptor>(),
new InterceptionBehavior<SecurableInterceptionBehavior>());
container.Configure<Interception>)
.AddPolicy("SecurityPolicy")
.AddCallHandler(new SecurityHandler());
上記のコードを SecurityHandler を使用して、または使用せずに試してみましたが、同じ結果が得られました。インターセプトは発生しません。
すべての助けに感謝します!
これまでに使用したリファレンスは次のとおりです。
https://msdn.microsoft.com/en-us/library/ff660851(v=pandp.20).aspx#interception_behavior_custom
PS 評判が悪いため、参照したリンクを 2 つ以上投稿できませんでした。ごめん :(
編集
コンテナーから型を解決すると、インターセプターを起動できます。
テストとして、これは機能しました:
container.RegisterType<ISecurable, Customer>(
new Interceptor<InterfaceInterceptor>(),
new InterceptionBehavior<SecurableInterceptionBehavior>());
var securable = container.resolve<ISecurable>();
securable.MinSecurityLevel = 1;