0

I am not sure how to avoid circular reference in following scenario. Issue is stackoverflow due to circular reference. How do I use Lazy or another approach to resolve this? I don't like to pass the container everywhere as well.

 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>();



        }
pats
  • 1,273
  • 2
  • 20
  • 43

2 Answers2

1

You can do this:

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

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

}

But in general, you should strive to avoid circular dependencies. I don't know your application domain, but I find it strange that MySocket depends on IVehicleManager. You should try to invert the dependency, e.g. by exposing an event on ISender.

Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
0

Prper way is to create a super class that MyVehicleManager and MySocket derive from. Or do lazy like you suggested, or a factory.

Mikes3ds
  • 592
  • 5
  • 12
  • I tried Lazy but ISender is always null in MyVehicleManager . How do I use Lazy properly or facotry. I have no idea. – pats Apr 08 '16 at 04:42