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时使用相同的实例。CA

忘了提到我确实希望在每个网络请求的生活方式中做到这一点,而不是单例或瞬态。

4

3 回答 3

1

根据城堡文档,单例行为已经是默认行为。因此,城堡将只创建一个 B 实例并将其传递给 A 和 C。

您应该担心的是您希望出现这种情况的情况。然后,您需要一些额外的配置,如链接文档中所述。

于 2012-03-10T09:08:54.530 回答
0

我看到两个选项。一,使用你的容器来管理的生命周期class

StructureMap Container,范围IUnitOfWork为当前HttpContext

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

这确保了对 的所有请求IUnitOfWork,在同一个HttpContext,具有相同的实例。

选项二,重构你的代码,这样你就不会遇到这个问题......

于 2012-03-10T01:14:46.550 回答
0

假设你真的想让 B 在 C 类中不暴露,那么这个怎么样:

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 回答