2009-04-01 12 views
0

アダプターパターンを使用してIoC(具体的にはUnity)と組み合わせると、プロパティーがアダプターのプロティティーを指すオブジェクトの新しいインスタンスを作成します(基本的にターゲットオブジェクトに適応する)。パブリックコンストラクタを持たない外部生成オブジェクトインスタンスの解決

私は以下のクラス構造を持つ例として:

public class Adaptee 
{ 
    private Adaptee() { } 

    public int MyProperty { get; set; } 

    public static Adaptee New() 
    { 
     return new Adaptee(); 
    } 
} 

public class Target 
{ 
    public int MyProperty { get; set; } 
} 

public class Adapter : Target 
{ 
    public Adapter(Adaptee adaptee) 
    { 
     this.MyProperty = adaptee.MyProperty; 
    } 
} 

public class MyTestClass 
{ 
    public Target MyTarget { get; set; } 
} 

問題はAdapteeは私の管理下にはなく、それは公共のコンストラクタ、アダプタの故に使用を持っていないということです。私はの実行を希望

using (UnityContainer container = new UnityContainer()) 
{ 
    container 
     .RegisterType<MyTestClass>(
      new InjectionProperty("MyTarget")); 

    container.RegisterInstance<Adaptee>(adaptee, new ExternallyControlledLifetimeManager()); 

    MyTestClass myTestClass = container.Resolve<MyTestClass>(); 
} 

:だからAdapteeは、実際のコード上記のコードは、外部から制御アセンブリ内で実行し、次のコードに渡されるで

Adaptee adaptee = Adaptee.New(); 
adaptee.MyProperty = 5; 

に従って作成されます以下もたらすためのコード:

Debug.Assert(myTestClass != null); 
Debug.Assert(myTestClass.MyTarget != null); 
Debug.Assert(myTestClass.MyTarget.MyProperty == adaptee.MyProperty); 

これはアダプタの分解インスタンスはmyTestClassインスタンスのMyTargetプロパティに注入されなければならないことを意味します。アダプタのインスタンスは、外部で作成されたAdapteeのインスタンスで作成されている必要があります。

次のコード:

container 
    .RegisterType<MyTestClass>(
     new InjectionProperty("MyTarget")); 

が実際にこの生じるはずである:

container 
    .RegisterType<MyTestClass>(
     new InjectionProperty("MyTarget", container.Resolve<Adapter>())); 

にアダプターのインスタンスがまだ存在しません、それはプライベートなコンストラクタを持っているので、これは可能ではないようです。

これを達成するために傍受または何かを使うべきですか?

答えて

1

私はcontainer.Resolve<Adapter>()考えに近いものであったが、最終的な答えはInjectionPropertyクラス用いて注入するプロパティ設定するときResolvedParameterクラスを使用するだけです:

new InjectionProperty(
    "MyTarget", 
    new ResolvedParameter<Adapter>())); 

したがって、呼び出しコードは次のようになります。

Adaptee adaptee = Adaptee.New(); 
adaptee.MyProperty = 5; 

using (UnityContainer container = new UnityContainer()) 
{ 
    container 
     .RegisterType<MyTestClass>(
      new InjectionProperty(
       "MyTarget", 
       new ResolvedParameter<Adapter>())); 

    container.RegisterInstance<Adaptee>(adaptee, new ExternallyControlledLifetimeManager()); 

    MyTestClass myTestClass = container.Resolve<MyTestClass>(); 
} 
01これはsomeboby他に役立ちます Setter/property injection in Unity without attributes

希望:

は、私は次の記事で解決策を見つけました。

0

これはDoh!瞬間

ソリューションは、次の設定団結を追加することです:

.RegisterType<Target, Adapter>() 

私は問題を解決し、このような簡単な解決策は、(私が思うに)、ことを逃した信じることができません。

MyTestClassのMyTargetプロパティは、Targetから継承されているため、アダプタのインスタンスに解決されます。アダプタは、明らかに、外部で作成されたAdapteeクラスのインスタンスで開始されます。

+0

だから、それは二重Dohです!瞬間 上記のコードは機能しますが、必ずしも理想的ではありません。ターゲットタイプは常にアダプタタイプに解決されるべきではありません。この場合は、MyTestClassのMyTargetプロパティに対してインジェクションが発生した場合にのみアダプタに解決されます。 – Schalk

関連する問題