如何在ConfigureServices中注入依赖ServiceStack服务的服务
解决方案
问题根源
ASP.NET Core ConfigureServices 阶段中,ServiceStack的核心服务(如IPasswordHasher)尚未注册到.NET Core依赖注入容器,此时直接注册依赖这些服务的自定义类会导致解析失败。
方法一:手动提前注册ServiceStack依赖
在ConfigureServices中先注册ServiceStack服务的具体实现,再注册自定义服务:
using ServiceStack.Auth; [assembly: HostingStartup(typeof(AppHost))] namespace test; public class AppHost() : AppHostBase("test"), IHostingStartup { public void Configure(IWebHostBuilder builder) => builder .ConfigureServices(services => { // 提前注册ServiceStack的IPasswordHasher实现 services.AddScoped<IPasswordHasher, PasswordHasher>(); // 再注册自定义服务 services.AddScoped<Something>(); }); public override void Configure() { SetConfig(new HostConfig { }); } } public class Something(IPasswordHasher hasher);
方法二:在ServiceStack的Configure方法中注册自定义服务
AppHost.Configure方法在ASP.NET Core启动流程之后执行,此时ServiceStack服务已完成注册,在此处注册自定义服务可直接解析依赖:
using ServiceStack.Auth; [assembly: HostingStartup(typeof(AppHost))] namespace test; public class AppHost() : AppHostBase("test"), IHostingStartup { public void Configure(IWebHostBuilder builder) => builder .ConfigureServices(services => { // 这里只注册不依赖ServiceStack服务的内容 }); public override void Configure() { SetConfig(new HostConfig { }); // 若使用认证功能,先注册AuthFeature(会自动注册IPasswordHasher等服务) Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new CredentialsAuthProvider() })); // 注册自定义服务到ServiceStack容器(自动同步到.NET Core容器) RegisterAs<Something, Something>(); // 或直接注册到.NET Core容器: // HostContext.AppServices.AddScoped<Something>(); } } public class Something(IPasswordHasher hasher);
方法三:使用延迟解析避免启动时依赖检查
通过Func<T>延迟获取ServiceStack服务实例,绕过启动时的容器验证:
using ServiceStack.Auth; [assembly: HostingStartup(typeof(AppHost))] namespace test; public class AppHost() : AppHostBase("test"), IHostingStartup { public void Configure(IWebHostBuilder builder) => builder .ConfigureServices(services => { services.AddScoped<Something>(); }); public override void Configure() { SetConfig(new HostConfig { }); // 确保ServiceStack服务已注册,比如添加AuthFeature Plugins.Add(new AuthFeature(() => new AuthUserSession(), new IAuthProvider[] { new CredentialsAuthProvider() })); } } // 使用Func<IPasswordHasher>延迟解析 public class Something(Func<IPasswordHasher> hasherFactory) { private readonly IPasswordHasher _hasher = hasherFactory(); }
内容的提问来源于stack exchange,提问作者glazjoon
相关产品推荐
相关产品推荐

