2016-04-08 42 views
0

我不確定如何在以下情況下避免循環引用。問題是由於循環引用引起的堆棧溢出。我如何使用Lazy或其他方法來解決此問題? 我不喜歡在任何地方通過容器。避免使用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>(); 



     } 

回答

1

你可以這樣做:

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

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

} 

但在一般情況下,你應該努力避免循環依賴。我不知道你的應用領域,但我覺得奇怪的是MySocket取決於IVehicleManager。您應該嘗試反轉依賴關係,例如通過在ISender上曝光事件。

0

比較方式是創建MyVehicleManager和MySocket派生自的超類。或者像你建議的那樣懶惰,或者工廠。

+0

我試過懶惰但ISender在MyVehicleManager中始終爲空。我如何正確使用Lazy或使用Lazy。我不知道。 – pats