如何使用对象初始化获取父类的实例,该父类已启动当前类?

时间:2018-08-13 16:34:54

标签: c# .net

我经常遇到这种情况。我终于在寻找如何做到这一点的答案。我了解有很多方法,但是大多数方法都是肮脏的,并且包含不良做法。

只需说清楚一点,这并不是在征求您的意见,而是在询问大多数程序员如何处理此类问题,几乎所有可能的方式都不会包含非常糟糕的代码。

我有一个名为CoreContext的类,该属性将新实例注入该属性的类名中,如下所示。但是,当我需要启动该类的父类时会发生什么?

说我需要CoreContextSocketHandler)内的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 },
        }
    }
};

1 个答案:

答案 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的实例!