我经常遇到这种情况。我终于在寻找如何做到这一点的答案。我了解有很多方法,但是大多数方法都是肮脏的,并且包含不良做法。
只需说清楚一点,这并不是在征求您的意见,而是在询问大多数程序员如何处理此类问题,几乎所有可能的方式都不会包含非常糟糕的代码。
我有一个名为CoreContext
的类,该属性将新实例注入该属性的类名中,如下所示。但是,当我需要启动该类的父类时会发生什么?
说我需要CoreContext
(SocketHandler
)内的ClientSocketHandler
实例。我将如何去做?我觉得这是一种非常简单的方法,但是我从来不知道那是什么。
有没有我看不到的简单调用堆栈,还是什么?请注意,我更喜欢这样做,我正在做的方式是对象初始化,以后不分配属性。
var coreContext = new CoreContext
{
ConfigHandler = new JsonConfigHandler(),
SocketHandler = new ClientSocketHandler(coreContext, IPAddress.Parse(""), 30),
PacketProvider = new PacketProvider
{
Events = new Dictionary<short, Action<ICoreContext, IIncomingPacket>>
{
{ IncomingPacketIds.AuthError, AuthErrorEvent.Process },
{ IncomingPacketIds.DeviceInformation, DeviceInformationEvent.Process },
{ IncomingPacketIds.AuthComplete, AuthCompleteEvent.Process },
}
}
};
答案 0 :(得分:2)
如果使用构造函数注入传递工厂委托来创建ClientSocketHandler
,则可以避免此问题,但是我不确定这是对在创建后简单地设置属性的一种改进。
(嗯,是的改进,因为构造函数注入比(IMO)优于属性注入。)
无论如何,这是一个示例,以防您使用它。
请注意使用context => new ClientSocketHandler(context)
将工厂委托传递给CoreContext
构造函数。
然后在CoreContext
构造函数中,您可以将this
传递给委托。
using System;
namespace Demo
{
class Program
{
public static void Main(string[] args)
{
var coreContext = new CoreContext(context => new ClientSocketHandler(context))
{
ConfigHandler = new ConfigHandler()
};
}
class ConfigHandler {}
class ClientSocketHandler
{
readonly CoreContext _coreContext;
public ClientSocketHandler(CoreContext coreContext)
{
_coreContext = coreContext;
}
}
class CoreContext
{
public CoreContext(Func<CoreContext, ClientSocketHandler> socketHandlerFactory)
{
SocketHandler = socketHandlerFactory(this);
}
public ClientSocketHandler SocketHandler { get; private set; }
public ConfigHandler ConfigHandler { get; set; }
}
}
}
请注意,如果使用构造函数注入,则可以省略SocketHandler
的setter。还要注意,您应该通过接口进行注入,但是为了简洁起见,我省略了它。我假设您不想new
在构造函数中ClientSocketHandler
的实例!