我的 SharpArchitecture,我做主之一:NHibernate在哪里?
在命名空间SharpArch.Data.NHibernate底下,我们可以看到NHibernateSession类,这个类,就是NHibernate在Sharp的栖息地! NHibernateSession是一个静态类,所以它是全局的,就像是一个工厂,在这里,你可以配置NHibernate,创建Session的实例...
下面显示的是NHibernateSession给我们的接口
{
public static class NHibernateSession
{
public static readonly string DefaultFactoryKey;
public static ISession Current { get; }
public static ISessionStorage Storage { get; set; }
public static ValidatorEngine ValidatorEngine { get; set; }
[CLSCompliant(false)]
public static Configuration AddConfiguration(string factoryKey, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, IDictionary<string, string> cfgProperties, string validatorCfgFile, IPersistenceConfigurer persistenceConfigurer);
public static void CloseAllSessions();
public static ISession CurrentFor(string factoryKey);
public static ISessionFactory GetDefaultSessionFactory();
public static ISessionFactory GetSessionFactoryFor(string factoryKey);
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel);
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, IDictionary<string, string> cfgProperties);
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, string cfgFile);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, IDictionary<string, string> cfgProperties);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile);
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, string cfgFile, string validatorCfgFile);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, string validatorCfgFile);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, IDictionary<string, string> cfgProperties, string validatorCfgFile);
[CLSCompliant(false)]
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, IDictionary<string, string> cfgProperties, string validatorCfgFile, IPersistenceConfigurer persistenceConfigurer);
public static void InitStorage(ISessionStorage storage);
public static bool IsConfiguredForMultipleDatabases();
public static void RegisterInterceptor(IInterceptor interceptor);
public static void RemoveSessionFactoryFor(string factoryKey);
public static void Reset();
}
}
我们很容易发现,这里面有多达9个的Init()方法的重载,这些方法都是用于实例化NHibernate Session(为什么要这么多重载,我像是因为C#当时没有还没有默认参数这一机制)。首先看看这些方法有两个共同的参数:
第一个参数storage,顾名思义,是一个存储器,存储什么?Session。为什么要存储Session?这里原因有二,一是从配置开始到实例化一个Session是需要很大的代价的,这里把已经实例化的Session做一缓存,可以提高效率;二是存储Session可以方便同时操作多个Session(我们知道,实例化Session是不能改变数据库配置的)。通过这个参数,我们可以自由存储Session,用什么来储存完全由我们决定,只要我们定义的储存符合接口ISessionStorage即可。
{
public interface ISessionStorage
{
ISession GetSessionForKey(string factoryKey);
void SetSessionForKey(string factoryKey, ISession session);
IEnumerable<ISession> GetAllSessions();
}
}
第二个参数mappingAssemblies,这是一些程序集的名称数组。这个数组很重要,他是指向你的实体映射的程序集,这个程序集可以包含FluentNHibernate映射,也可以包含NHibernate映射。同时,Sharp也提供给我们FluentNHibernate的一部分常规映射,例如,实体对应的数据表名被映射为实体类名的复数形式等。如果想改变某个实体的映射,则需要重新写实体映射关系类,下的代码是一个User实体类的映射:
{
#region IAutoMappingOverride<User> 成员
public void Override(FluentNHibernate.Automapping.AutoMapping<User> mapping)
{
mapping.Map(c => c.UserType).CustomType<UserType>();
}
#endregion
}
映射类需要实现IAutoMappingOverride<T>接口(关于更多的映射请参考FluentNHibernate Wiki)。
再看看另外两个重要的参数
autoPersistenceModel是告诉Sharp,在mappingAssemblies程序集中有做怎样的映射处理,cfgFile是告诉Sharp,NHibernate的配置文件。
在用Sharp模板生产的项目里,找到Global.asax.cs文件,我们可以看到
{
NHibernateSession.Init(
webSessionStorage,
new string[] { Server.MapPath("~/bin/SomeProject.Data.dll") },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/NHibernate.config"));
}
这么一段代码,这就是在初始化Session。
关于Session部分就介绍到这里。