2016-04-08 2 views
0

Я не уверен, как избежать круговой ссылки в следующем сценарии. Проблема представляет собой stackoverflow из-за циклической ссылки. Как использовать 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

Prper way - это создание суперкласса, из которого получают MyVehicleManager и MySocket. Или ленитесь, как вы предложили, или завод.

+0

Я пробовал Lazy, но ISender всегда имеет значение null в MyVehicleManager. Как использовать Lazy правильно или facotry. Понятия не имею. – pats

 Смежные вопросы

  • Нет связанных вопросов^_^