You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 17:37:28