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

.NET Framework 4.8控制台应用Host类报错及DI使用咨询

问题解答

1. 解决error CS0103: The name 'Host' does not exist in the current context报错

以下是几种直接有效的排查和解决方法:

  • 确认NuGet包版本兼容性:.NET Framework 4.8对高版本的Microsoft.Extensions.Hosting支持有限,建议使用6.x系列的稳定版本(如6.0.1),避免使用.NET 7及以上对应的包版本。可直接在.csproj中明确版本号:
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
    
  • 清理重建并恢复NuGet包:右键项目选择「清理」,删除项目目录下的bin和obj文件夹,通过NuGet包管理器点击「恢复」重新拉取依赖,最后重新编译项目。
  • 验证命名空间引用:确保Program.cs顶部已正确引入命名空间,且拼写无误:
    using Microsoft.Extensions.Hosting;
    

2. .NET Framework 4.8控制台应用依赖注入的正确用法

基于Microsoft.Extensions.Hosting实现依赖注入的标准流程如下:

核心步骤

  1. 配置宿主构建器,注册所需服务(支持构造函数注入)
  2. 构建宿主实例,通过服务作用域解析并使用服务
  3. 释放宿主资源,避免内存泄漏

完整代码示例

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace NetFrameworkDIConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            // 构建宿主并配置服务
            var host = Host.CreateDefaultBuilder(args)
                .ConfigureServices((context, services) =>
                {
                    // 根据业务需求选择服务生命周期
                    services.AddSingleton<IDataService, DataService>();
                    services.AddScoped<IBusinessService, BusinessService>();
                    services.AddTransient<IUtilityService, UtilityService>();
                })
                .Build();

            // 创建服务作用域,解析作用域/瞬态服务
            using var scope = host.Services.CreateScope();
            var serviceProvider = scope.ServiceProvider;

            try
            {
                // 解析核心服务并执行业务逻辑
                var businessService = serviceProvider.GetRequiredService<IBusinessService>();
                businessService.Execute();
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine($"执行出错: {ex.Message}");
            }

            // 释放宿主资源
            host.Dispose();
        }
    }

    // 示例服务定义
    public interface IDataService
    {
        string GetData();
    }

    public class DataService : IDataService
    {
        public string GetData() => "从数据源获取的数据";
    }

    public interface IBusinessService
    {
        void Execute();
    }

    public class BusinessService : IBusinessService
    {
        private readonly IDataService _dataService;
        private readonly IUtilityService _utilityService;

        // 构造函数注入依赖
        public BusinessService(IDataService dataService, IUtilityService utilityService)
        {
            _dataService = dataService;
            _utilityService = utilityService;
        }

        public void Execute()
        {
            var data = _dataService.GetData();
            var processedData = _utilityService.ProcessData(data);
            System.Console.WriteLine($"处理后的数据: {processedData}");
        }
    }

    public interface IUtilityService
    {
        string ProcessData(string rawData);
    }

    public class UtilityService : IUtilityService
    {
        public string ProcessData(string rawData) => $"[{rawData}] 已处理";
    }
}

关键注意事项

  • 服务生命周期选择:
    • Singleton:全局仅一个实例,适合无状态的工具类服务
    • Scoped:每个服务作用域内一个实例,适合单次操作内复用的服务
    • Transient:每次解析都创建新实例,适合轻量、无状态的服务
  • 配置文件支持:Host.CreateDefaultBuilder默认加载appsettings.json,需将该文件的「复制到输出目录」属性设置为「始终复制」或「如果较新则复制」
  • 作用域管理:解析Scoped或Transient服务时,必须通过CreateScope创建服务作用域,避免生命周期冲突或内存泄漏

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:45:29