2016-04-23 2 views
0

StructureMap 2からバージョン3へのアップグレード時にTypeInterceptorによって現在提供されている機能を再現する方法に関する有用なガイドが見つかりませんでした(v4にアップグレードできないため、 .NET 4.6を使用しています)。TypeInterceptorのStructuremap 3の置き換え

基本的にどのようなインターセプタが行うことは、このされています

public class TheInterceptor : TypeInterceptor 
{ 
    private Dictionary<string, string> typesToIntercept; 

    public TheInterceptor(IDictionary<string, string> typesToIntercept) 
    { 
     // Passed in on ctor, comes from XML configuration section. 
     this.typesToIntercept = typesToIntercept; 
    } 

    public object Process(object target, StructureMap.IContext ctx) 
    { 
     var typedTarget = target as BaseType; 
     var key = target.GetType().FullName; 

     if (typedTarget == null || !typesToIntercept.ContainsKey(key)) 
     { 
      return target; 
     } 

     var propertyOverrideType = typesToIntercept[key]; 

     typedTarget.BaseProperty = ctx.GetInstance<IBaseInterface>(propertyOverrideType); 

     return typedTarget; 
    } 
} 

だから我々は基本的にキーは、我々が傍受したいタイプで、値が既知のインタフェースを実装した特定のタイプである辞書を維持しています、インターセプトされたオブジェクトのプロパティに設定する必要があります。

FWIW元のコードは書きませんでしたが、構造マップ3でこの動作を正しく反映する方法がわかりません。私はそれがインターセプタなしでできるようなものだと思っていますが、このように実装されているので、各サイトが明示的に傍受の振る舞いを扱わなくても、複数のサイト(共有ライブラリにあります)可能であれば、私はこの使用法を保持したいと思います。

答えて

1

私は結局試行錯誤でこれを理解しました。必要なのはActivatorInterceptorで、これは以前はTypeInterceptorのProcessメソッド内にあったロジックを実行するためにActionデリゲートを使用します。したがって、上のコードスニペットから、次のようになります。