使用 Unity 4.0 C# 时避免循环引用
avoid Circular reference when using Unity 4.0 C#
我不确定在以下情况下如何避免循环引用。由于循环引用,问题是计算器溢出。我如何使用 Lazy 或其他方法来解决这个问题?
我也不喜欢到处传递容器。
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>();
}
正确的方法是创建一个超级 class MyVehicleManager 和 MySocket 从中派生。或者像你建议的那样偷懒,或者工厂。
你可以这样做:
public class MySocket : ISender
{
[Dependency]
public Lazy<IVehicleManager> VehicleManager { get; set; }
public void Connect()
{
Console.WriteLine("MySocket: Connect");
VehicleManager.Value.AddActiveConnection();
}
}
但总的来说,你应该努力避免循环依赖。我不知道你的应用领域,但我觉得很奇怪 MySocket
依赖于 IVehicleManager
。您应该尝试反转依赖关系,例如通过在 ISender
.
上公开事件
我不确定在以下情况下如何避免循环引用。由于循环引用,问题是计算器溢出。我如何使用 Lazy 或其他方法来解决这个问题? 我也不喜欢到处传递容器。
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>();
}
正确的方法是创建一个超级 class MyVehicleManager 和 MySocket 从中派生。或者像你建议的那样偷懒,或者工厂。
你可以这样做:
public class MySocket : ISender
{
[Dependency]
public Lazy<IVehicleManager> VehicleManager { get; set; }
public void Connect()
{
Console.WriteLine("MySocket: Connect");
VehicleManager.Value.AddActiveConnection();
}
}
但总的来说,你应该努力避免循环依赖。我不知道你的应用领域,但我觉得很奇怪 MySocket
依赖于 IVehicleManager
。您应该尝试反转依赖关系,例如通过在 ISender
.