我的 SharpArchitecture,我做主之一:NHibernate在哪里?

在命名空间SharpArch.Data.NHibernate底下,我们可以看到NHibernateSession类,这个类,就是NHibernate在Sharp的栖息地! NHibernateSession是一个静态类,所以它是全局的,就像是一个工厂,在这里,你可以配置NHibernate,创建Session的实例...

 

下面显示的是NHibernateSession给我们的接口

namespace SharpArch.Data.NHibernate
{
    
public static class NHibernateSession
    {
        
public static readonly string DefaultFactoryKey;

        
public static ISession Current { get; }
        
public static ISessionStorage Storage { getset; }
        
public static ValidatorEngine ValidatorEngine { getset; }

        [CLSCompliant(
false)]
        
public static Configuration AddConfiguration(string factoryKey, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, IDictionary<stringstring> 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<stringstring> cfgProperties);
        
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, string cfgFile);
        [CLSCompliant(
false)]
        
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, IDictionary<stringstring> 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<stringstring> cfgProperties, string validatorCfgFile);
        [CLSCompliant(
false)]
        
public static Configuration Init(ISessionStorage storage, string[] mappingAssemblies, AutoPersistenceModel autoPersistenceModel, string cfgFile, IDictionary<stringstring> 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#当时没有还没有默认参数这一机制)。首先看看这些方法有两个共同的参数:

ISessionStorage storage, string[] mappingAssemblies

第一个参数storage,顾名思义,是一个存储器,存储什么?Session。为什么要存储Session?这里原因有二,一是从配置开始到实例化一个Session是需要很大的代价的,这里把已经实例化的Session做一缓存,可以提高效率;二是存储Session可以方便同时操作多个Session(我们知道,实例化Session是不能改变数据库配置的)。通过这个参数,我们可以自由存储Session,用什么来储存完全由我们决定,只要我们定义的储存符合接口ISessionStorage即可。

代码
namespace SharpArch.Data.NHibernate
{
    
public interface ISessionStorage
    {
        ISession GetSessionForKey(
string factoryKey);
        
void SetSessionForKey(string factoryKey, ISession session);
        IEnumerable
<ISession> GetAllSessions();
    }
}

第二个参数mappingAssemblies,这是一些程序集的名称数组。这个数组很重要,他是指向你的实体映射的程序集,这个程序集可以包含FluentNHibernate映射,也可以包含NHibernate映射。同时,Sharp也提供给我们FluentNHibernate的一部分常规映射,例如,实体对应的数据表名被映射为实体类名的复数形式等。如果想改变某个实体的映射,则需要重新写实体映射关系类,下的代码是一个User实体类的映射:

    public class UserMap : IAutoMappingOverride<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 autoPersistenceModel, string cfgFile


 autoPersistenceModel是告诉Sharp,在mappingAssemblies程序集中有做怎样的映射处理,cfgFile是告诉Sharp,NHibernate的配置文件。


 在用Sharp模板生产的项目里,找到Global.asax.cs文件,我们可以看到

        private void InitializeNHibernateSession()
        {
            NHibernateSession.Init(
                webSessionStorage,
                
new string[] { Server.MapPath("~/bin/SomeProject.Data.dll") },
                
new AutoPersistenceModelGenerator().Generate(),
                Server.MapPath(
"~/NHibernate.config"));
        }

这么一段代码,这就是在初始化Session。

 关于Session部分就介绍到这里。

 

 

 

posted @ 2010-04-20 10:49  Yibu  阅读(1081)  评论(0编辑  收藏  举报