簡體   English   中英

使用Unity 4.0 C#時避免循環引用

[英]avoid Circular reference when using Unity 4.0 C#

我不確定在以下情況下如何避免循環引用。 由於循環引用,問題是堆棧溢出。 如何使用懶惰或其他方法解決此問題? 我也不喜歡將容器傳遞到任何地方。

 public class MySocket : ISender
    {
        [Dependency]
        public IVehicleManager VehicleManager { get; set; }

        public void Connect()
        {
            Console.WriteLine("MySocket: Connect");
            VehicleManager.AddActiveConnection();
        }

    }


 public class MyVehicleManager : IVehicleManager
    {
        [Dependency]
        public ISender Sender { get; set; }

        public void AddActiveConnection()
        {
            Console.WriteLine("MyVehicleManager: Add");
        }

        public void SendPacketToVehicle(ISender sender)
        {
            Console.WriteLine("MyVehicleManager: Passing data");
            sender.SendPacket();
        }

    }

   static void Main(string[] args)
        {
            UContainer = new UnityContainer();
            UContainer.RegisterType<IVehicleManager, MyVehicleManager>(new ContainerControlledLifetimeManager());
            UContainer.RegisterType<MySocket, MySocket>(new ContainerControlledLifetimeManager());
            MySocket myInstance = UContainer.Resolve<MySocket>();



        }

你可以這樣做:

public class MySocket : ISender
{
    [Dependency]
    public Lazy<IVehicleManager> VehicleManager { get; set; }

    public void Connect()
    {
        Console.WriteLine("MySocket: Connect");
        VehicleManager.Value.AddActiveConnection();
    }

}

但總的來說,您應該努力避免循環依賴。 我不知道您的應用程序域,但是我發現MySocket依賴IVehicleManager感到奇怪。 您應該嘗試反轉依賴關系,例如,通過在ISender上公開一個事件。

Prper方法是創建一個MyVehicleManager和MySocket派生的超類。 或者像您建議的那樣懶惰,或者去工廠。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM