NHibernate,AutoFac,如何使用容器代替.core的默认容器

时间:2018-07-11 16:20:46

标签: .net nhibernate containers autofac

通过这种方式,它注册了必需的对象。

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();
    }
   }

编辑: 我已经读到,在全球范围内打开会话并维护它不是一个好习惯,对吧?

1 个答案:

答案 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();