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; }
}

問題は、アダプティーが私の管理下になく、パブリック コンストラクターがないため、アダプターを使用することです。したがって、Adapte は次のように作成されます。

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

実際のコードでは、上記のコードは外部で制御されたアセンブリで実行され、次のコードに渡されます。

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

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

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

コードを実行すると、次のようになります。

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

これは、解決された Adapter のインスタンスを myTestClass インスタンスの MyTarget プロパティに挿入する必要があることを意味します。Adapter のインスタンスは、外部で作成された Adaptee のインスタンスで作成されているはずです。

次のコード:

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

実際には次のようになります。

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

Adapter のインスタンスがまだ存在せず、プライベート コンストラクターがあるため、これは可能ではないようです。

これを達成するために傍受などを使用する必要がありますか?

4

2 に答える 2

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>();
}

次の投稿で解決策を見つけました: 属性のない Unity でのセッター / プロパティ注入

これが他の誰かに役立つことを願っています。

于 2009-04-09T06:36:09.247 に答える