nanoFramework WebServer路由正常但Controller构造函数未调用依赖注入失效
问题原因
这是nanoFramework.WebServer的默认设计行为,不属于bug。
你当前通过传入Type数组注册Controller的方式,框架内部默认只会通过无参构造函数反射创建Controller实例,没有预留和DI容器对接的自动解析逻辑——框架根本不知道构造函数需要传入IDHTService实例,自然不会调用你写的带参构造。
你观察到的构造函数断点跳过、路由方法正常命中的现象,是当前版本WebServer的静默失败逻辑导致的:反射创建Controller实例失败后,框架不会抛出初始化异常,会直接路由到匹配的方法执行,此时Controller对象的字段没有完成初始化,service字段为null,业务逻辑自然无法正常运行。
正确集成依赖注入的方法
不需要修改Controller的现有代码,通过WebServer提供的自定义Controller实例化入口对接DI容器即可,步骤如下:
- 先完成DI容器的初始化,按你原有配置完成
IDHTService和DHTController的服务注册,确认容器可正常解析DHTController实例 - 初始化WebServer时,使用支持自定义Controller工厂的构造重载,传入从DI容器获取实例的委托,替换默认的无参构造反射逻辑,参考代码:
// 以下为DI初始化示例,和你现有DI写法保持一致即可 var serviceCollection = new ServiceCollection(); serviceCollection.AddSingleton(typeof(IDHTService), typeof(DHTService)); serviceCollection.AddTransient(typeof(DHTController)); var serviceProvider = serviceCollection.BuildServiceProvider(); // WebServer初始化,传入自定义实例化逻辑 using (WebServer server = new WebServer(80, HttpProtocol.Http, controllerType => serviceProvider.GetService(controllerType), new Type[] { typeof(DHTController) })) { Debug.WriteLine("Iniciando server..."); server.Start(); var nis = NetworkInterface.GetAllNetworkInterfaces(); foreach (var ni in nis) { Debug.WriteLine("Seu endereço de IP é: " + ni.IPv4Address.ToString()); } Thread.Sleep(Timeout.Infinite); }
配置完成后,WebServer在处理请求时会通过你传入的委托从DI容器获取Controller实例,构造函数会被正常调用,依赖注入逻辑可正常执行。
轻量替代方案
如果不想调整WebServer初始化逻辑,也可以用服务定位器模式快速实现,改动量更小:
- 程序启动初始化DI容器后,将
ServiceProvider实例存为全局可访问的静态变量 - 给
DHTController添加无参构造函数,在构造函数内从全局静态容器中获取IDHTService实例赋值给私有字段,原有路由方法不需要做任何修改
该方案耦合度更高,但是不需要依赖WebServer的自定义工厂能力,适合资源紧张、逻辑简单的嵌入式场景快速落地。
内容的提问来源于stack exchange,提问作者Vitor Martins
相关产品推荐
相关产品推荐

