nFluent NHibernate .net核心会话管理

时间:2019-02-25 09:33:08

标签: c# .net asp.net-mvc

我是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)示例工作代码,并在服务层与事务共享存储库代码,则将受到高度赞赏

0 个答案:

没有答案