csharp: Configuring ASP.NET with Spring.NET and FluentNHibernate

Domain: FluentNhibernateLocalSessionFactoryObject.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?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 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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

1
2
3
4
5
6
7
8
9
10
11
12
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?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/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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));
                }
            }
        }
    }
}

  

 

posted @   ®Geovin Du Dream Park™  阅读(568)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2010-06-26 asp.net3.5 csharp Calendar 控件显示周次
2009-06-26 jQuery InputHintBox
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示