<?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解决方案
工程结构分部:
Solution-
src
Domain
Entities
Mappings
Dao
Config
Interface
InterfaceImpl
Nhibernate(这一层可以不写用上面的)
Nhibernate
Service
Interface
InterfaceImpl
Winform工程
lib
doc
1、新建一个类库工程domain,位置路径为解决方案路径下面的src下面。
vs工程新建的时候必须看下工程的属性必须选择 .net framework 4 默认是client这个有问题。使用spring.net和nhibernate时候报引用错误
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>