Xamarin中EmbedIO WebServer如何通过自定义依赖注入容器解析控制器构造函数依赖
解决方案:让EmbedIO使用自定义DI容器解析控制器依赖
完全可以实现!EmbedIO提供了扩展方法让你替换它默认的依赖解析器,直接复用你已经配置好的IServiceProvider就行,具体步骤如下:
1. 先获取你自定义的服务提供者实例
你已经有了自己的Init()方法来初始化服务集合,先拿到这个实例:
var customServiceProvider = YourServiceInitializer.Init(); // 替换成你实际的类名
2. 在WebServer配置中添加自定义依赖解析器
修改你的WebServer创建代码,通过.WithDependencyResolver()方法把自定义的IServiceProvider传入,这样EmbedIO就会用你的容器来解析控制器的构造函数依赖:
var server = new WebServer(o => o .WithUrlPrefix(url) .WithMode(HttpListenerMode.EmbedIO)) .WithCors() .WithLocalSessionManager() // 关键:指定使用你的自定义DI容器作为依赖解析器 .WithDependencyResolver(customServiceProvider) .WithWebApi("/api", m => m.WithController<TestController>() .WithController<SettingsController>() .WithController<ReportController>() .WithController<SystemController>()) .WithModule(new ActionModule("/", HttpVerbs.Any, ctx => ctx.SendDataAsync(new { Message = "Error" })));
为什么这能生效?
EmbedIO的WithDependencyResolver方法接受一个标准的IServiceProvider实现,当WebApi模块需要创建控制器实例时,会委托给你传入的自定义容器来解析构造函数中的所有依赖项——比如你在TestController中声明的ICsvExporter,会直接从你之前注册的单例服务中获取,完全符合你的需求。
额外提示
如果你的控制器本身需要被容器管理(比如有其他生命周期需求),也可以把控制器类型注册到你的ServiceCollection中,比如:
// 在你的ConfigureServices()方法中添加 services.AddTransient<TestController>(); services.AddTransient<SettingsController>(); // 其他控制器同理
不过这不是必须的,EmbedIO默认会自动实例化控制器,仅用你的容器解析其依赖。
内容的提问来源于stack exchange,提问作者Qhori
相关产品推荐
相关产品推荐

