2017-06-21 9 views
2

私はUnityContainerを使用してスマートIOCリゾルバを作成しようとしていますが、これは解決プロセスの一環としてサードパーティのサービスから情報を受け取ります。各関連解決要求あたりUnityContainerを使用した動的IOCマッピング - どのように達成できますか?

<type type="IMyInterface" mapTo="MyInstance"> 
    <lifetime type="Hierarchical" /> 
</type> 

私はmapToを削除し、実行時にそれを提供したいと思います(:

configエントリは、一般的に、この(私はすべてのタイプのエイリアスのを作成しました)のようになりたい場合)。

今、私はUnityContainerExtensionBuilderStrategyを作成することでこれをやってみました。物事は面倒で分かりました。

mapTo部分をオーバーライドしたいだけなので、私は遠くに行ったかもしれないと思います。

どうすればこのような機能を実現できますか?
とにかくmapToのgetter \戦略をオーバーライドできますか?

+0

あなたは直接 'IMyInterface'を解決するつもりですか?最終的に 'IMyInterface'に依存する別の型ですか?あなたは例を挙げることができますか? –

+0

私はapi呼び出しを行い、 "mapTo"型(IMyInterfaceを実装する)を選択するのに役立つヒントを得て、UnityContainerを新しいmapTo型にします。 mapの種類ランタイムファクトリです。 例:インターフェイスはIVehicleです。 IVehicleを解決する必要があるときには、マップされた型を計算する必要があります。私はAPIコールを実行し、正しいタイプ(この例ではTruckまたはSportsCarかもしれません)を返したいと思います。 –

+0

具体的なタイプを直接解決してみませんか?例えばトラックまたはSportsCar –

答えて

2

私はフックを見つけました。

まず、あなたが新しいマッピングのルックアップしますBuilderStrategyを作成する必要があります。

public class DynamicMappingBuildStrategy: BuilderStrategy 
{ 
    public override void PreBuildUp(IBuilderContext context) 
    { 
     var policy = context.Policies.Get<IBuildKeyMappingPolicy>(context.BuildKey); 

     if (policy != null) 
     { 
      context.BuildKey = policy.Map(context.BuildKey, context); 
     } 
     else 
     { 
      var oldMapping = context.BuildKey; 
      var mappedType = DynamicMapper.GetMapping(oldMapping.Type); 
      context.BuildKey = new NamedTypeBuildKey(mappedType, null); 
      var lifetime = context.PersistentPolicies.Get<ILifetimePolicy>(oldMapping, true); 

      if (lifetime != null) 
      { 
       context.PersistentPolicies.Set(lifetime, context.BuildKey); 
      } 
     } 
    } 
} 

は、その後、あなたは正しいUnityBuildStageBuilderStrategyを追加しますUnityContainerExtensionを作成する必要があります。

public class DynamicMappingBehaviorExtension : UnityContainerExtension 
{ 
    protected override void Initialize() 
    { 
     this.Context.Strategies.AddNew<DynamicMappingBuildStrategy>(UnityBuildStage.TypeMapping); 
    } 
} 

新しいコンテナを使用するようにコンテナを設定する必要があります。

<containers> 
      <container> 
       <extensions> 
        <add type="MyNamespace.DynamicMappingBehaviorExtension, MyDll" /> 
       </extensions> 
....More configuration..... 

そして、あなたはmapToせずにあなたのタイプのマッピングを追加する必要があります。

<type type="IVehicle"> 
    <lifetime type="Hierarchical" /> 
</type> 
関連する問題