2016-04-08 39 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