ASP.NET Core 6.0 MVC项目中NHibernate ISession依赖注入报错:激活UserService时无法解析ISession类型服务
解决NHibernate在.NET Core 6 MVC中无法解析ISession的依赖注入问题
问题根源
你碰到的System.AggregateException核心原因是ASP.NET Core的依赖注入(DI)容器找不到NHibernate.ISession的注册服务。你的Program.cs仅注册了业务服务和认证配置,但完全没有配置NHibernate的核心组件(ISessionFactory和ISession),导致UserService在被DI容器实例化时,无法获取所需的ISession依赖。
分步解决方案
1. 确认NHibernate NuGet包已安装
首先确保项目中已安装NHibernate及适配.NET Core的相关包:
# 基础NHibernate包 Install-Package NHibernate # 可选:用于简化ASP.NET Core集成的包 Install-Package NHibernate.AspNetCore
2. 在Program.cs中注册NHibernate服务
需要将NHibernate的ISessionFactory(单例生命周期)和ISession(作用域生命周期)注册到DI容器中。以下是两种常见配置方式:
方式1:使用传统hibernate.cfg.xml配置
using DiplomaWork.App; using DiplomaWork.App.Services; using Microsoft.IdentityModel.Tokens; using NHibernate; using NHibernate.Cfg; using System.Text; var builder = WebApplication.CreateBuilder(args); var configValue = builder.Configuration; var authenticationSettings = new AuthenticationSettings(); configValue.GetSection("Authentication").Bind(authenticationSettings); // 配置NHibernate var nhibernateConfig = new Configuration(); // 读取根目录下的hibernate.cfg.xml配置文件 nhibernateConfig.Configure(); // 添加实体所在程序集(自动扫描映射文件) nhibernateConfig.AddAssembly(typeof(DiplomaWork.App.Entities.User).Assembly); // 注册ISessionFactory为单例(整个应用生命周期只创建一次) builder.Services.AddSingleton<ISessionFactory>(nhibernateConfig.BuildSessionFactory()); // 注册ISession为Scoped(每个HTTP请求创建一个新会话) builder.Services.AddScoped<ISession>(sp => sp.GetRequiredService<ISessionFactory>().OpenSession()); // 原有服务注册保持不变 builder.Services.AddControllersWithViews(); builder.Services.AddScoped<IUserService, UserService>(); builder.Services.AddSingleton(authenticationSettings); // ... 认证配置、中间件配置保持不变 ... var app = builder.Build(); app.Run();
方式2:代码式配置(推荐.NET Core风格)
如果不想使用xml配置文件,可以直接用代码配置数据库连接和映射:
// 替换上述NHibernate配置部分 var nhibernateConfig = new Configuration(); nhibernateConfig.DataBaseIntegration(db => { // 根据你的数据库选择对应的Dialect,比如SQL Server 2012+ db.Dialect<NHibernate.Dialect.MsSql2012Dialect>(); // 从appsettings.json读取数据库连接字符串 db.ConnectionString = configValue.GetConnectionString("DefaultConnection"); db.Driver<NHibernate.Driver.SqlClientDriver>(); // 可选:开启SQL日志(开发环境用) db.LogSqlInConsole = true; }); // 添加实体映射(如果使用FluentNHibernate,这里换成Fluent的配置方式) nhibernateConfig.AddAssembly(typeof(DiplomaWork.App.Entities.User).Assembly);
3. 验证修复效果
重新构建解决方案,DI容器现在会自动为UserService注入ISession实例,之前的激活错误应该会消失。
NHibernate文档资源
关于NHibernate的最新使用指南,你可以参考:
- 官方文档:覆盖了从入门配置到高级查询的全流程内容,包含.NET Core集成的专门章节
- GitHub仓库Wiki:仓库内的wiki有大量版本更新说明和实用示例代码
- 社区技术博客:很多.NET开发者分享的实战教程,聚焦于NHibernate在现代.NET项目中的最佳实践
注意:一定要匹配你安装的NHibernate版本来查阅文档,避免版本差异导致的问题。
内容的提问来源于stack exchange,提问作者KK 13
相关产品推荐
相关产品推荐

