我是Dotnet的Java开发人员,并尝试使用.net core 2.2和nHibernate 5.2构建应用程序。但不确定如何正确地进行会话管理。
在Java Spring中,我们曾经使用@Transactional注释,并且已经做好了准备,但是在这里看不到类似的东西,或者可能是我没有正确配置
我使用了以下网址的帮助 NHibernate SessionFactory handled by .NET Core DI 但没有提供太多细节。 它给我错误,不能使用正确的单例内部作用域。
这是我拥有的层结构 控制器->服务调用 (存储库1,存储库2)
因此,我的事务应从服务层开始,所有下划线存储库调用应属于同一事务。 我的Startup.cs看起来像这样
f3 a = Not specified
f2 a = 3
f1
然后 NHibernateHelper看起来像这样
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<GenericService>();
services.AddSingleton<IGenericRepository, GenericRepositoryImpl>();
services.AddSingleton<INHibernateHelper, NHibernateHelper>();
services.AddMvc();
services.AddSession();
}
我在RepositoryLevel注入了Hibernate helper,因此我可以在Repository级别访问ISession,但是每次必须使用
public class NHibernateHelper : INHibernateHelper
{
private readonly string _connectionString;
private readonly object _lockObject = new object();
private ISessionFactory _sessionFactory;
public NHibernateHelper(IConfiguration configuration)
{
_connectionString = configuration["ConnectionStrings:DefaultConnection"];
}
private ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
CreateSessionFactory();
}
return _sessionFactory;
}
}
public ISession OpenSession()
{
return SessionFactory.OpenSession();
}
private void CreateSessionFactory()
{
var fluentConfiguration = Fluently.Configure()
.Database(
MsSqlConfiguration.MsSql2012.ConnectionString(_connectionString).ShowSql()
)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<GenricEntityMapping>()
);
_sessionFactory = fluentConfiguration.BuildSessionFactory();
}
}
如何从服务层开始使用此会话,并且同一会话应传播到存储库级别。 如果任何人都可以与服务共享(.net和nHibernate)示例工作代码,并在服务层与事务共享存储库代码,则将受到高度赞赏