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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:00:54