zoukankan      html  css  js  c++  java
  • 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));
                    }
                }
            }
        }
    }
     
    

      

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/geovindu/p/7079309.html
Copyright © 2011-2022 走看看