Domain: FluentNhibernateLocalSessionFactoryObject.cs Dao:dataAccess.xml NHibernate 配置 Dao:objects.xml Service:objects.xml FluentNHibernateSpingNetDemo ...
Domain: FluentNhibernateLocalSessionFactoryObject.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Spring.Data.NHibernate; using NHibernate.Cfg; using FluentNHibernate.Automapping; using FluentNHibernate.Conventions.Helpers; using FluentNHibernate.Cfg; using FluentNHibernate.Cfg.Db; using System.Reflection; using FluentNHibernate; using NHibernate.Tool.hbm2ddl; using NHibernate; namespace Geovin.Du.Domain { /// <summary> /// 塗聚文20170623 /// </summary> public class FluentNhibernateLocalSessionFactoryObject : LocalSessionFactoryObject { ///// <summary> ///// Sets the assemblies to load that contain fluent nhibernate mappings. ///// </summary> ///// <value>The mapping assemblies.</value> //public string[] FluentNhibernateMappingAssemblies { // get; // set; //}MySQLConfiguration.Standard public string[] FluentNhibernateMappingAssemblies { get; set; } public string ConnectionStringName { get; set; } static readonly object factorylock = new object(); protected override void PostProcessConfiguration(Configuration config) { ConnectionStringName = "Server=GEOVINDU-PC;Database=DuMailSystem;User ID=sa;Password=塗聚文"; base.PostProcessConfiguration(config); FluentConfiguration fluentConfig = Fluently.Configure(config) .Database(MsSqlConfiguration.MsSql2012.ConnectionString(ConnectionStringName)) //MsSql2005 MsSql2012 .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)); Array.ForEach(FluentNhibernateMappingAssemblies, assembly => fluentConfig.Mappings( m => m.FluentMappings.AddFromAssembly(Assembly.Load(assembly)) .Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never()) ) ); fluentConfig.BuildSessionFactory(); } } //class }
Dao:dataAccess.xml
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database" xmlns:tx="http://www.springframework.net/tx"> <!--描述--> <description> 數據訪問的配置信息 包括:DbProvider NHibernate </description> <!-- 通過主應用程式的上下文配置文件引用 --> <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> <property name="ConfigSections" value="spring/databaseSettings"/> </object> <!-- 資料庫的配置--> <db:provider id="DbProvider" provider="SqlServer-2.0" connectionString="Server=${db.server};Database=${db.database};User ID=${db.userid};Password=${db.password}" /> <!-- Fluent NHibernate 配置 塗聚文 Geovin Du--> <!-- 可以通過 name 為其指定別名 name="SessionFactory" --> <object id="NHibernateSessionFactory" type="Geovin.Du.Domain.FluentNhibernateLocalSessionFactoryObject, Domain"> <!--關於資料庫連接的配置,直接使用 DbProvider 中的設置,這樣,不需要為 Hibernate 再提供連接串和驅動--> <property name="DbProvider" ref="DbProvider"/> <!--包含有映射文件的程式集,需要分析的hbm程式集名稱--> <property name="FluentNhibernateMappingAssemblies"> <list> <value>Domain</value> </list> </property> <!--其他的參數--> <property name="HibernateProperties"> <dictionary> <!--方言MsSql2005Dialect--> <entry key="dialect" value="NHibernate.Dialect.MsSql2012Dialect"/> <entry key="use_proxy_validator" value="false" /> <entry key="show_sql" value="true"/> </dictionary> </property> <!--必須增加此項說明,與 Spring 的聲明式事務集成--> <property name="ExposeTransactionAwareSessionFactory" value="true" /> </object>
NHibernate 配置
<!-- NHibernate 配置 塗聚文 Geovin Du --> <!-- 可以通過 name 為其指定別名 name="SessionFactory" --> <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject,Spring.Data.NHibernate4"> <!--關於資料庫連接的配置,直接使用 DbProvider 中的設置,這樣,不需要為 Hibernate 再提供連接串和驅動--> <property name="DbProvider" ref="DbProvider"/> <!--包含有映射文件的程式集,需要分析的hbm程式集名稱--> <property name="MappingAssemblies"> <list> <value>Domain</value> </list> </property> <!--其他的參數--> <property name="HibernateProperties"> <dictionary> <!--方言--> <entry key="dialect" value="NHibernate.Dialect.MsSql2005Dialect"/> <entry key="use_proxy_validator" value="false" /> <entry key="show_sql" value="true"/> </dictionary> </property> <!--必須增加此項說明,與 Spring 的聲明式事務集成--> <property name="ExposeTransactionAwareSessionFactory" value="true" /> </object>
Dao:objects.xml
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <object id="CustomerDaoImpl" type="Geovin.Du.Dao.CustomerDao,Dao"> <!--ref 表示引用的對象--> <property name="SessionFactory" ref="NHibernateSessionFactory" /> </object> <object id="SendMailDaoImpl" type=" Geovin.Du.Dao.SendMailDao,Dao"> <!--ref 表示引用的對象--> <property name="SessionFactory" ref="NHibernateSessionFactory" /> </object> </objects>
Service:objects.xml
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <object id="CustomerServiceImpl" type="Geovin.Du.Service.CustomerService" > <!--ref 表示引用的對象--> <property name="CustomerDao" ref="CustomerDaoImpl" /> </object> <object id="SendMailServiceImpl" type="Geovin.Du.Service.SendMailService"> <!--ref 表示引用的對象--> <property name="SendMailDao" ref="SendMailDaoImpl" /> </object> </objects>
FluentNHibernateSpingNetDemo:objects.xml
<?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net"> <object id="framework" type="FluentNHibernateSpingNetDemo.Framework"> <property name="Name" value="Spring.NET"/> </object> <!-- 頁面對象 --> <object type="~/Default.aspx"> <!-- ref 表示引用的對象 --> <property name="Framework" ref="framework"/> </object> <object type="~/Customer/index.aspx"> <property name="CustomerService" ref="CustomerServiceImpl"/> </object> <object type="~/Send/index.aspx"> <property name="SendMailService" ref="SendMailServiceImpl"/> </object> </objects>
FluentNHibernateSpingNetDemo:Web.config
<?xml version="1.0"?> <!-- 有關如何配置 ASP.NET 應用程式的詳細信息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <configSections> <!-- Spring 的配置 --> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web"/> <!-- 資料庫的配置參數 --> <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/> </sectionGroup> <!-- 日誌配置 --> <sectionGroup name="common"> <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" /> </sectionGroup> </configSections> <connectionStrings> <add name="SqlConnection" connectionString="Server=GEOVINDU-PC;Database=DuMailSystem;User ID=sa;Password=770214" providerName="System.Data.SqlClient"/> <add name="SqlRole" connectionString="dbo"/> <!--<add name="SqlConnection" connectionString="Server=124.172.156.191;Database=dupcitgeovindu;User ID=dupcitgeovindu_f;Password=lf770214;" providerName="System.Data.SqlClient"/> <add name="SqlRole" connectionString="dupcitgeovindu_f"/>--> </connectionStrings> <spring> <context> <resource uri="~/Config/objects.xml"/> <!-- 嵌入在程式集中的配置文件 ,首先是程式集名稱,然後命名空間,最後文件名, 註意名稱的大小寫必須完全一致 --> <resource uri="assembly://Dao/Dao.Config/dataAccess.xml"/> <resource uri="assembly://Dao/Dao.Config/objects.xml"/> <resource uri="assembly://Service/Service.Config/objects.xml"/> </context> <!--資料庫配置伺服器地址--> <databaseSettings> <add key="db.server" value="GEOVINDU-PC"/> <add key="db.database" value="DuMailSystem"/> <add key="db.userid" value="塗聚文"/> <add key="db.password" value="塗聚文"/> </databaseSettings> </spring> <!--<common> <logging> <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net"> 使用 log4net 配置文件 <arg key="configType" value="FILE-WATCH" /> <arg key="configFile" value="~/Config/log4net.xml" /> </factoryAdapter> </logging> </common>--> <appSettings> <!-- 為 OpenSessionInViewModule 的 SessionFactory 提供名字 --> <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/> </appSettings> <system.web> <compilation debug="true" targetFramework="4.0" /> <!--<authentication mode="Forms"> <forms loginUrl="~/Account/Login.aspx" timeout="2880" /> </authentication>--> <httpModules> <!-- Spring 提供的 Module --> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> <!-- 由 Spring 自動打開會話,必須提供一個名為 SessionFactory 的會話工廠 使用後,可以使用 SessionFactory 的 GetCurrentSession 方法獲取會話 --> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate4"/> </httpModules> <httpHandlers> <!-- Spring 提供的處理程式 --> <add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/> <!-- 取消 Spring.NET 對於 Web 服務的處理 --> <!--<add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>--> <add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/> <add verb="*" path="*.ashx" type="Spring.Web.Support.DefaultHandlerFactory, Spring.Web"/> </httpHandlers> <!--<membership> <providers> <clear/> <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> </providers> </membership> <profile> <providers> <clear/> <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/> </providers> </profile> <roleManager enabled="false"> <providers> <clear/> <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> </providers> </roleManager>--> </system.web> <!--<system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer>--> </configuration>
http://blog.bennymichielsen.be/2009/01/04/using-fluent-nhibernate-in-spring-net/
protected override void PostProcessConfiguration(Configuration config) { base.PostProcessConfiguration(config); Fluently.Configure(config) .Database(MySQLConfiguration.Standard.ConnectionString( c => c.FromConnectionStringWithKey(“connectionString”))) .Mappings( m => m.FluentMappings .AddFromAssemblyOf()) .BuildSessionFactory(); } protected override ISessionFactory NewSessionFactory(Configuration config) { config = Fluently.Configure(config) .Mappings(m => m.FluentMappings.AddFromAssemblyOf()) .BuildConfiguration(); return base.NewSessionFactory(config); } here is the implementation if you are using FluentNhibernate auto mapping : protected override void PostProcessConfiguration(Configuration config) { base.PostProcessConfiguration(config); var autoMappingCfg = new AutoMappingConfiguration(); var autoMap = AutoMap.AssemblyOf(autoMappingCfg) .Conventions.Add(DefaultCascade.All(), DefaultLazy.Never()) .Conventions.Add() .Override(map => { map.IgnoreProperty(i => i.Total); }); Fluently.Configure(config) .Mappings(m => m.AutoMappings.Add(autoMap)) .BuildConfiguration(); } in outmapping you don’t need to inject FluentNhibernateMappingAssemblies. so configure Sping.Net accordingly using System; using System.Collections.Generic; using System.Linq; using System.Text; using Spring.Data.NHibernate; using FluentNHibernate; using System.Reflection; using NHibernate.Cfg; namespace SessionFactories { public class FluentNhibernateLocalSessionFactoryObject : LocalSessionFactoryObject { /// <summary> /// Sets the assemblies to load that contain fluent nhibernate mappings. /// </summary> /// <value>The mapping assemblies.</value> public string[] FluentNhibernateMappingAssemblies { get; set; } protected override void PostProcessConfiguration(Configuration config) { base.PostProcessConfiguration(config); if(FluentNhibernateMappingAssemblies != null) { foreach(string assemblyName in FluentNhibernateMappingAssemblies) { config.AddMappingsFromAssembly(Assembly.Load(assemblyName)); } } } } }