csharp: Configuring ASP.NET with Spring.NET and FluentNHibernate
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)); } } } } }
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)