2
public interface IBaz { IBar bar { get; set; } }
public class Baz : IBaz
{
    public IBar bar { get; set;  }
    public Baz(IBar bar) { this.bar = bar;  }
}

public interface IBar { IBaz baz { get; set;  } }
public class Bar : IBar
{
    public IBaz baz { get; set; }
    public Bar(IBaz baz) { this.baz = baz; }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer container = new UnityContainer();

        container.RegisterType<IBar, Bar>(new ContainerControlledLifetimeManager());
        container.RegisterType<IBaz, Baz>(new ContainerControlledLifetimeManager());

        //Problem 1: I get a stack-overflow, but I am using the singleton lifetime manager?
        var bar = container.Resolve<IBar>(); 
        var baz = container.Resolve<IBaz>();

        //Problem 2: I want Unity to do this automatically for me. How?
        bar.baz = baz; baz.bar = bar;

        var result = object.ReferenceEquals(bar, baz.bar) && object.ReferenceEquals(baz, bar.baz); 
    }
4

1 に答える 1

1

いいえ、現時点ではありません。オブジェクトは、すべてのプロパティが設定されるまで「構築済み」とは見なされないため、それが発生するまで、ライフタイムマネージャーに保存されません。この場合、スタックオーバーフローが発生します。

于 2010-12-09T21:39:44.997 に答える