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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:57:51