通过这种方式,它注册了必需的对象。
services.AddSingleton<NHibernate.ISessionFactory>(
NHibernateSessionProvider.NHibernateSessionFactory(Configuration));
services.AddScoped<NHibernate.ISession>(factory =>
factory
.GetServices<NHibernate.ISessionFactory>()
.First()
.OpenSession()
);
我想使用autoFac并将配置移到单独的类。
public class AutoFacModule : Module
{
private static IContainer _container;
public delegate ISession SessionDelegate(IConfiguration configuration);
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType.......
}
}
}
但是我不知道如何。我正在尝试将类从静态更改为普通等。帮助。这就是我的ISessionFactory工厂的样子
public static class NHibernateSessionProvider
{
public static ISessionFactory
NHibernateSessionFactory(IConfiguration configuration)
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2012
.ConnectionString(configuration
.GetConnectionString("connectionString"))
.ShowSql())
// Mapping our entity
.Mappings(m => m.FluentMappings
.AddFromAssemblyOf<TaskToDoItem>())
// Create your schema at runtime.
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(true, true))
.BuildConfiguration()
.BuildSessionFactory();
}
}
编辑: 我已经读到,在全球范围内打开会话并维护它不是一个好习惯,对吧?
答案 0 :(得分:0)
我通常根据每个请求确定会话范围。但这是基于Web的应用程序。您当然想避免举行会议的时间过长。
我使用的SessionProvider
如下所示(为简洁起见进行了编辑):
public static class SessionProvider
{
private static readonly Lazy<ISessionFactory> _sessionFactory = new Lazy<ISessionFactory>(CreateSessionFactory);
private static ISessionFactory SessionFactory => _sessionFactory.Value;
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
private static ISessionFactory CreateSessionFactory()
{
return
Fluently
.Configure(Config)
.Mappings()
.BuildSessionFactory();
}
}
然后我通常使用工厂方法将ISession
注册为按请求范围的服务:
container.Register(c => SessionProvider.OpenSession(), Lifestyle.Scoped);
我没有在IoC容器中注册SessionFactory
。我依靠它的静态特性和固有的线程安全性。
我对AutoFac不熟悉,但是我想您应该可以执行以下操作:
builder.Register(c => SessionProvider.OpenSession()).InstancePerRequest();