【问题标题】:Simulate the "Per Graph" lifestyle in Castle Windsor模拟温莎城堡的“Per Graph”生活方式
【发布时间】:2014-05-29 17:51:13
【问题描述】:

我正在尝试模拟温莎的“Per Graph”生活方式,以便以正确的方式解析我的对象。我尝试过 Bound 的生活方式,但没有任何成功,可能是由于缺乏这方面的知识。 下面的示例代码表达了我所需要的:

class Program
{
    static void Main( string[] args )
    {
        var container = new WindsorContainer();
        container.Register(
            Component.For<ClassA>().LifestyleBoundTo<ClassC1>(),
            //Component.For<ClassA>().LifestyleBoundTo<ClassC2>(),
            Component.For<ClassB1>().LifeStyle.Transient,
            Component.For<ClassB2>().LifeStyle.Transient,
            Component.For<ClassC1>().LifeStyle.Transient,
            Component.For<ClassC2>().LifeStyle.Transient );

        var c1 = container.Resolve<ClassC1>();
        Assert.AreSame( c1.B1.A, c1.A );

        var c2 = container.Resolve<ClassC2>();
        Assert.AreSame( c2.B2.A, c2.A );

        Assert.AreNotSame( c1.A, c2.A );
    }
}

class ClassA
{
}

class ClassB1
{
    public ClassB1( ClassA a)
    {
        A = a;
    }

    public ClassA A { get; set; }
}

class ClassC1
{
    public ClassC1( ClassA a, ClassB1 b1 )
    {
        A = a;
        B1 = b1;
    }

    public ClassA A { get; set; }
    public ClassB1 B1 { get; set; }
}

class ClassB2
{
    public ClassB2( ClassA a )
    {
        A = a;
    }

    public ClassA A { get; set; }
}

class ClassC2
{
    public ClassC2( ClassA a, ClassB2 b2 )
    {
        A = a;
        B2 = b2;
    }

    public ClassA A { get; set; }
    public ClassB2 B2 { get; set; }
}

}

【问题讨论】:

标签: castle-windsor windsor-3.0


【解决方案1】:

好的,一切都按预期进行。

您的第一个断言按预期通过。第二个按预期失败,因为您根据ClassC1 确定ClassA 的范围,并且图表中没有该类的实例用于第二个解析。

【讨论】:

  • 还有一种方法可以将 ClassA 的范围也用于 ClassC2?在我的项目中,我有一个特殊的类,它被许多核心组件引用。对于每个核心组件,我只需要该特殊类的一个共享实例。
  • 你的核心组件是否有一个它们都实现的通用接口?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多