net的app.config程序配置Spring.net和nhibernate

<?xml version="1.0"?>
<configuration> 
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821"/>
        <sectionGroup name="spring">
            <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
            <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
    </configSections>

    <spring>
        <context>
            <resource uri="config://spring/objects"/>
        </context>
        <parsers>
            <parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
            <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
        </parsers>

        <objects xmlns="http://www.springframework.net"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:tx="http://www.springframework.net/tx"
             xmlns:db="http://www.springframework.net/database">

            <db:provider id="DbProvider"
                           provider="SqlServer-2.0"
                           connectionString="Data Source=CHETUIWK123\SQL2008R2;Integrated Security=true;Database=TestNhibernate;"/>
            <object id="MySessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate33">
                <property name="ExposeTransactionAwareSessionFactory" value="true" />
                <property name="DbProvider" ref="DbProvider"/>
                <property name="MappingAssemblies">
                    <list>
                        <value>BlackOpsP2.Core</value>
                    </list>
                </property>
                <property name="HibernateProperties">
                    <dictionary>

                        <entry key="hibernate.connection.provider"
                               value="NHibernate.Connection.DriverConnectionProvider"/>

                        <entry key="dialect"
                               value="NHibernate.Dialect.MsSql2008Dialect"/>

                        <entry key="hibernate.connection.driver_class"
                               value="NHibernate.Driver.SqlClientDriver"/>

                    </dictionary>
                </property>
            </object>

            <object id="HibernateTransactionManager"
            type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate33">
                <property name="SessionFactory" ref="MySessionFactory"/>
            </object>

            <object id="EmployeeDao" xsi:schemaLocation="" type="BlackOpsP2.Data.EmployeeDao, BlackOpsP2.Data">
                <property name="SessionFactory" ref="MySessionFactory"/>
            </object>

            <object id="EmployeeService" type="BlackOpsP2.Services.ARModule.EmployeeService, BlackOpsP2.Services">
                <property name="TransactionManager" ref="HibernateTransactionManager"/>
                <property name="Dao" ref="EmployeeDao"/>
            </object>

            <object id="EmployeeController" type="BlackOpsP2.Presentation.Controller.ARModule.EmployeeController, BlackOpsP2.Presentation">
                <property name="Service" ref="EmployeeService"/>
            </object>

            <!--> manually added -->
            <object id="Form" type="BlackOpsP2.UI.Form1, BlackOpsP2.UI">
                <property name="Controller" ref="EmployeeController"/>
            </object>
            <!--> /****/ -->

            <tx:attribute-driven transaction-manager="HibernateTransactionManager"/>
        </objects>
    </spring>

    <log4net>
        <appender name="FileAppender" type="log4net.Appender.FileAppender,log4net">
            <file value="E:\Test\log.txt"/>
            <appendToFile value="true"/>
            <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %level %logger - %message%newline"/>
            </layout>
            <filter type="log4net.Filter.LevelRangeFilter">
                <levelMin value="INFO"/>
                <levelMax value="FATAL"/>
            </filter>
        </appender>

        <root>
            <level value="DEBUG"/>
            <appender-ref ref="FileAppender"/>
        </root>
    </log4net>
</configuration>

一、打开vs2010,菜单文件->新建->项目->其它项目类型->vs解决方案

net的app.config程序配置Spring.net和nhibernate_第1张图片

工程结构分部:

       Solution-

                     src

                          Domain

                                        Entities

                                        Mappings

                          Dao

                                        Config

                                        Interface

                                        InterfaceImpl

                          Nhibernate(这一层可以不写用上面的)

                                        Nhibernate

                          Service

                                        Interface

                                        InterfaceImpl                                       

                          Winform工程

                     lib

                     doc

1、新建一个类库工程domain,位置路径为解决方案路径下面的src下面。

net的app.config程序配置Spring.net和nhibernate_第2张图片

vs工程新建的时候必须看下工程的属性必须选择 .net framework 4 默认是client这个有问题。使用spring.net和nhibernate时候报引用错误

 

net的app.config程序配置Spring.net和nhibernate_第3张图片

net的app.config程序配置Spring.net和nhibernate_第4张图片

2、在Domain工程下新建2个文件夹Entities和Mappings,然后使用自动生成工具生成entities和mappings文件并添加进vs2010对应工程文件夹,因为用了动软生成实体,和codesmith生成配置文件所以生成的文件名字、字段属性可能不一致,这里需要修改一下。

 用到mapping的时候配置文件必须是嵌入式的否则会报错

Error creating context 'spring.root': InputStream is null from Resource = [assembly [Dao, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null], resource [Dao.Dao.Config.Dao.xml]]

 

3、再次新建类库工程Dao(Service)下面新建2个文件夹Dao、DaoImpl(Service、ServiceImpl)。添加对应的业务接口可实现。

4、添加form工程WinForm  添加Form文件夹,编写Form程序

Form 程序入口添加log4net 加载。也可以把form 交给spring.net管理(不推荐)

第一步:在项目中添加对log4net.dll

第二步:程序启动时读取log4net的配置文件。

如果是CS程序,在根目录的Program.cs中的Main方法中添加:

log4net.Config.XmlConfigurator.Configure();

如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:

log4net.Config.XmlConfigurator.Configure();

无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:

[assembly: log4net.Config .XmlConfigurator()]

 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //读取log4net配置文件
            log4net.Config.XmlConfigurator.Configure(); 

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
          

            //IApplicationContext ctx = ContextRegistry.GetContext();
            //Form1 from1 = (Form1)ctx.GetObject("Form1");
            //Application.Run(from1);
        }
    }

form表单程序

private void button1_Click(object sender, EventArgs e)
        {
            // create and configure objects
            //IApplicationContext ctx = new XmlApplicationContext("assembly://Dao/Dao.Config/Dao.xml", "assembly://Service/Service.Config/Service.xml");

            IApplicationContext ctx = ContextRegistry.GetContext();
            IProductService productService = ctx.GetObject("ProductService") as IProductService;
            productService.ProcessProduct();
        }


 

二、配置app.config

1、在WinForm工程中添加app.config xml配置文件

<?xml version="1.0"?>
<configuration>
  <!--加载需要用到的配置文件-->
  <configSections>
    <!--Spring 配置节点id-->
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
    </sectionGroup>
    
    <!--Log4net 日志配置节点id-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    <!--数据库配置节点id-->
    <section name="databaseSettings" type="System.Configuration.NameValueSectionHandler"/>
  </configSections>
  <!--Spring 配置节点id对应具体的配置文件位置3种读法-->
  <spring>
    <context>
      <!--第一种App.config 在Context配置节中作如下指示-->
      <resource uri="config://spring/objects"/>
      <!--第二种最常用 读取嵌入在程序集中的配置文件 ,首先是解决方案下的类库的程序集名称,然后解决方案下面的项目名+项目配置文件路径,注意名称的大小写必须完全一致 -->
      <!--Dao-->
      <resource uri="assembly://Dao/Dao.Config/Dao.xml"/>
      <resource uri="assembly://Service/Service.Config/Service.xml"/>
      <!-- 第三种从文件目录位置读取配置文件-->
      <!--<resource uri="file://D:/SvnProject/NetProjectDemo/Spring.Nhibernate.App/src/WinForm/Service.xml"/>-->
    </context>
    <parsers>
      <parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
      <parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
    </parsers>
    <!--第一种就是把Dao.xml的内容贴到这里App.config 在Context配置节中作如下指示-->
    <objects xmlns="http://www.springframework.net">
      <description>An  example that demonstrates simple IoC features.</description>
      <!--<object id="Form1" type="WinForm.Form1">-->
      <!--</object>-->
    </objects>

  </spring>
  <!-- These properties are referenced in Dao.xml -->
  <databaseSettings>
    <add key="db.datasource" value="127.0.0.1"/>
    <add key="db.user" value="root"/>
    <add key="db.password" value=""/>
    <add key="db.database" value="kasai"/>
  </databaseSettings>

 

  <!--log4net 配置节点id对应具体的配置文件位置-->
  <log4net>
    <!--控制台输出日志-->
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <!--文件日志输出-->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
      <param name="File" value="Logs/Log.log" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="10" />
      <param name="MaximumFileSize" value="10MB" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <param name="datePattern" value="yyyy-MM-dd HH:mm" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
      </layout>
    </appender>

     <!--默认日志输出级别根节点,其它没有写的话都继承这个Set default logging level to DEBUG--> 
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="ConsoleAppender"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>

     <!--设置其他插件日志输出Set logging for Spring.  Logger names in Spring correspond to the namespace--> 
    <logger name="Spring">
      <level value="DUBUG"/>
    </logger>

    <logger name="Spring.Data">
      <level value="DUBUG"/>
    </logger>

    <logger name="NHibernate">
      <level value="DUBUG"/>
    </logger>


  </log4net>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

2、Dao.xml配置文件下面红色标注的地方必须注意不同版本可能有所区别,文档上的跟新不是很及时有些东西是老的容易出错。还是要看版本更新列表说明。

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
         xmlns:db="http://www.springframework.net/database">

  <!-- Referenced by main application context configuration file -->
  <description>
    The Northwind object definitions for the Data Access Objects.
  </description>

  <!-- 用以我们在其它的应用程序中,配置数据访问 -->
  <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
    <property name="ConfigSections" value="databaseSettings"/>
  </object>

  <!-- Database Configuration -->
  <db:provider id="DbProvider"
               provider="MySql-5.2.3"
               connectionString="Data Source=127.0.0.1;Database=kasai;User Id=root;Password="/>
  <!--connectionString="Data Source=${db.datasource};Database=${db.database};User Id=${db.user};Password=${db.password};"-->

  <!-- NHibernate Configuration -->
  <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="MappingAssemblies">
      <list>
        <!--mapping所在程序集-->
        <value>Domain</value>
      </list>
    </property>
    <property name="HibernateProperties">
      <dictionary>
        <!--配置属性不同版本key和value可能都不一样-->
        <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
        <entry key="dialect" value="NHibernate.Dialect.MySQL5Dialect"/>
        <entry key="connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
        <entry key="use_proxy_validator" value="false" />
      </dictionary>
    </property>

    <!-- provides integation with Spring's declarative transaction management features -->
    <property name="ExposeTransactionAwareSessionFactory" value="true" />

  </object>


  <!-- Transaction Management Strategy - local database transactions -->
  <object id="transactionManager"
        type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">

    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>

  </object>


  <!-- Exception translation object post processor -->
  <!--<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/>-->

  <!-- Data Access Objects -->

  <object id="ProductDao" type="Dao.InterfaceImpl.ProductDao, Dao">
    <property name="SessionFactory" ref="NHibernateSessionFactory"/>
  </object>

</objects>

2.3 Servcie.xml 配置

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
         xmlns:tx="http://www.springframework.net/tx">

  <!-- Referenced by main application context configuration file -->

  <description>
    The  service layer definitions
  </description>

  <!-- Property placeholder configurer for database settings -->
  <object id="ProductService" type="Service.InterfaceImpl.ProductService, Service">
    <property name="ProductDao" ref="ProductDao"/>
  </object>

  <tx:attribute-driven/>


</objects>




 

 


 

你可能感兴趣的:(WinForm,app.config,spring.net,NHibernate)