2

リンクされている 3 つの異なるクラスがあります。これを団結して登録します。

それらを正しく解決するのに問題があります。

クラスは次のようになります。

public class A: IA
{
    public IB B { get; private set; }
    public IC C { get; private set; }

    public A(IB b, IC c)
    {
        this.B = b;
        this.C = c;
    }
}

public class B : IB
{
    public IC C { get; private set; }

    public B(IC c)
    {
        this.C = c;
    }
}

public class C :IC{}


public interface IA
{
    IB B { get; }
    IC C { get; }
}
public interface IB{
    IC C { get; }
}
public interface IC{}

ユニティ構成は次のようになります。

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
   <container>
        <register type="IA" mapTo="A" />
        <register type="IB" mapTo="B" />
        <register type="IC" mapTo="C" />
      </container>
</unity>

これは、Unity から A を解決し、A オブジェクトと B オブジェクトの両方で同じ C オブジェクトを取得しようとしている Main クラスです。

public class Main
{
    public Main()
    {
        //This works..
        IC objC = new C();
        IB objB =new B(objC);
        IA objA = new A(objB,objC);

        //We want to do this.
        //How do we register in Unity to ensure we get the same object for C in both A and B
        IA obj1 = Unity.Resolve<IA>();
        Debug.Assert(obj1.C == obj1.B.C);


        //It's very important that two diffrent resolved objects of A don't have the same C object
        IA obj2 = Unity.Resolve<IA>();
        Debug.Assert(obj2.C == obj2.B.C);
        Debug.Assert(obj1.C != obj2.C);
    }
}

これは団結して達成することは可能ですか?たぶん、いくつかのLifetime Managesを使用してですか?

4

2 に答える 2

1

A のコンストラクターで IC を指定することにより、実際には B で使用されているものと同じ C を参照したい一方で、C の別のインスタンスが必要であるというコミュニケーションになります。

ライフタイム管理を使用して、Unity で問題を解決できます。

ただし、同じインスタンスがコードから同じインスタンスを使用することが本当に重要な場合。そうすることで、あなたの意図をより明確に伝え、その重要性がメンテナーに見えるようになります。

class A{
   ...
   IC C { get{ return B.C; }}

   public A (IB b){...}
   ...
}
于 2013-11-05T10:54:33.773 に答える
1

C には Per Resolve ライフタイム マネージャーを使用できます。これにより、個別の Resolve 呼び出しごとに C の新しいインスタンスを作成するよう Unity に指示します。ただし、1 回の解決では、オブジェクト グラフへの挿入に使用される C のインスタンスは 1 つだけです。

構成は次のようになります。

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <container>
    <register type="IA" mapTo="A" />
    <register type="IB" mapTo="B" />
    <register type="IC" mapTo="C">
      <lifetime type="perresolve"/>
    </register>
  </container>
</unity>

上記の構成では、Asserts が渡されます。

于 2013-11-06T05:29:11.663 に答える