Unity解析对象并在依赖关系解析对象中获取相同的对象

时间:2013-11-05 10:40:19

标签: c# unity-container

我们有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配置如下所示:

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

这是我们的Main类,我们试图从Unity中解析A并在A对象和B对象中获得相同的C对象。

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

这有可能在团结中实现吗? 也许通过使用一些终身管理?

2 个答案:

答案 0 :(得分:1)

通过在A的构造函数中指定IC,您需要一个不同的C实例,而实际上想要引用与B中使用的相同的C

您可以通过终身管理解决Unity中的问题。

但是,如果让相同的实例使用代码中的相同实例非常重要。通过这样做,您可以更清楚地传达您的意图,并且维护者可以看到它的重要性。

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

   public A (IB b){...}
   ...
}

答案 1 :(得分:1)

您可以为C使用Per Resolve生命周期管理器。这告诉Unity为每个单独的Resolve调用创建一个新的C实例。但是,在单个解析期间,只会使用一个C实例注入对象图。

配置如下所示:

<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将通过。