2016-04-08 32 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(); 
    } 

} 

しかし、一般的には、あなたが循環依存関係を避けるために努力すべきである

。私はあなたのアプリケーションドメインを知らないが、 MySocketIVehicleManagerに依存していることが奇妙だと分かっている。依存関係を逆転させるようにしてください。 ISenderにイベントを公開します。

0

Prperの方法がMyVehicleManagerとMySocketから派生スーパークラスを作成することです。またはあなたが提案したように怠惰な、または工場。

+0

私はLazyを試しましたが、ISenderはMyVehicleManagerで常にnullです。 Lazyを適切に使用するにはどうすればよいですか?何も思いつきません。 – pats

関連する問題