简体   繁体   English

使用Unity 4.0 C#时避免循环引用

[英]avoid Circular reference when using Unity 4.0 C#

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



        }

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 . 我不知道您的应用程序域,但是我发现MySocket依赖IVehicleManager感到奇怪。 You should try to invert the dependency, eg by exposing an event on ISender . 您应该尝试反转依赖关系,例如,通过在ISender上公开一个事件。

Prper way is to create a super class that MyVehicleManager and MySocket derive from. Prper方法是创建一个MyVehicleManager和MySocket派生的超类。 Or do lazy like you suggested, or a factory. 或者像您建议的那样懒惰,或者去工厂。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM