0

したがって、ペイントで描画できると仮定しましょう。

私の問題の恐ろしい描写

AオブジェクトBに依存し、インスタンス化さCれるがC、 のインスタンスにも依存するクラスがありB、 のこのインスタンスをBに渡すものと同じにしたいとしますA。どうすればこれを達成できますか?

さて、あなたもおそらくそれをまったく理解していませんでした。それでは、先に進んでコードに変換します。

public class A
{
    private readonly B b;
    private readonly C c;

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

public class B
{    
}

public class C
{
    private readonly B b;

    public C(B b)
    {
        this.b = b;
    }
}

DI がなければ、次のように解決します。

var b = new B();
var c = new C(b);
var a = new A(b,c);

DI を使用してこのようなことをきれいに達成するにはどうすればよいでしょうか? 私が望むのは非常に簡単です。 と のB両方Cをインスタンス化するときに、 の同じインスタンスを使用しますA

シングルトンや一時的なものではなく、Web リクエストごとのライフスタイルでこれが必要であることに言及するのを忘れていました。

4

3 に答える 3

1

城のドキュメントによると、シングルトンの動作はすでにデフォルトになっています。したがって、castle は B のインスタンスを 1 つだけ作成し、それを A と C の両方に渡します。

心配する必要があるのは、これを望まない場合です。リンクされたドキュメントで説明されているように、追加の構成が必要です。

于 2012-03-10T09:08:54.530 に答える
0

クラスCでBを非公開にしておきたいと仮定すると、これはどうでしょうか。

class Program
{
  static void Main(string[] args)
  {
     var b = new B();
     var c = new C(b);
     var a = c.GetA();
  }
}

public class A
{
  private readonly B b;
  private readonly C c;

  public abstract class AFactory
  {
     private B b;

     public AFactory(B b)
     {
        this.b = b;
     }

     protected A GetA(C c)
     {
        return new A(b, c);
     }

     abstract public A GetA();
  }

  private A(B b, C c)
  {
     this.b = b;
     this.c = c;
  }
}

public class B
{
}

public class C
{
  private readonly B b;
  private CAFactory afactory;

  private class CAFactory : A.AFactory
  {
     private C c;
     public CAFactory(C c) : base(c.b)
     {
        this.c = c;
     }

     public A GetA()
     {
        return GetA(c);
     }
  }

  public C(B b)
  {
     this.b = b;
     afactory = new CAFactory(this);
  }

  public A GetA()
  {
     return afactory.GetA();
  }
}
于 2012-03-10T03:39:10.200 に答える
0

2 つの選択肢があります。1 つ目は、コンテナを使用して次のライフタイムを管理することclassです。

StructureMap ContainerIUnitOfWork、現在のスコープHttpContext:

For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>();

IUnitOfWorkこれにより、同じ 内のに対するすべてのリクエストがHttpContext同じインスタンスを持つことが保証されます。

オプション 2、コードをリファクタリングして、この問題が発生しないようにします...

于 2012-03-10T01:14:46.550 に答える