Я - Java-разработчик, плохо знакомый с Dotnet, и пытаюсь создать приложение, используя .net core 2.2 и nHibernate 5.2.Но не уверен, как правильно управлять сессиями.
В Java Spring мы используем аннотацию @Transactional, и все уже позаботилось, но не можем увидеть подобные вещи здесь или, может быть, я неправильно выполняю настройку
Я использовал справку, указанную ниже url NHibernate SessionFactory, обработанную .NET Core DI , но не предоставил подробностей.это дает мне ошибку, я не могу использовать область видимости внутри синглтона, что правильно.
Это структура слоя, у меня есть Controller -> Service вызывает (Repository 1, Repository 2)
Так что моя транзакция должна начатьсяиз уровня обслуживания и все подчеркнутые вызовы репозитория должны быть частью одной транзакции.мой Startup.cs выглядит следующим образом
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<GenericService>();
services.AddSingleton<IGenericRepository, GenericRepositoryImpl>();
services.AddSingleton<INHibernateHelper, NHibernateHelper>();
services.AddMvc();
services.AddSession();
}
И NHibernateHelper выглядит следующим образом
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();
}
}
Я внедряю помощник Hibernate на RepositoryLevel, чтобы я мог получить доступ к ISession на уровне репозитория, но каждый разЯ должен использовать
using (var session = OpenSession())
{
}
Как использовать этот сеанс, начиная с уровня обслуживания, и тот же сеанс должен распространяться на уровень хранилища.Если кто-то может поделиться (.net и nHibernate) образцом рабочего кода с сервисом и кодом репозитория с транзакцией на сервисном уровне, мы будем очень признательны