Spring.Net + Ibatis.Net + Log4Net 结合搭的一个简单多层开发架子

Spring.Net 作用:注入具体类;

Ibatis.Net  作用:数据持久化,数据查询;

Log4Net 作用: 日志记录;

多层架构: 可以参考网上的资料,简单说来就是把系统操作按某种逻辑分类物理的组织到不同的类库中。在完成一个完整的系统操作时让他们按步骤层层调用完成该操作的所需。例如说我们要新增加一个用户,我们会在前端页面输入用户信息,然后把传递到后端类中校验必须的数据是否为空,还要判断用户名是否被使用。如果没有问题则把数据插入到数据库中。在这个操作中,我们把负责用户信息输入的页面放到一个单独层中(UI), 把判断用户输入数据的合法性校验放到另外一个层中(Business),数据最后入库再单独放到一个层中(Access)着就是最简单的三层结构。

 

在我设计的这个架构中,简单分成了五层,具体如图所示: 

其中多了两层:Mode层 该层内容灰常简单,是一个表对象的关系映射类,例如我在这个架子中加了示例Product在那在该层中就有对应的类,具体代码如下

 

View Code
namespace Mode
{
    
public class ProductMode : BaseMode
    {
        
private int _ID = int.MinValue;
        
public int ID
        { 
set { _ID = value; } get { return _ID; } }

        
public string Name
        { 
setget; }

        
private int _Uid = int.MinValue;
        
public int Uid
        { 
set { _Uid = value; } get { return _Uid; } }

        
private Decimal _Price = int.MinValue;
        
public Decimal Price
        { 
set { _Price = value; } get { return _Price; } }
    }
}

 

该类是对数据库中表Product的一个映射。他是数据容器,用来收集数据,返回数据用的。在Ibatis中要用它传递数据以便持久化到数据库中。

 

Common层 该层主要作用是定义一些公共操作的类。比如说我们用的日记记录器,SPRING对象容器的封装类。都在这层中。

这两层的作用决定了他们是公用的,也就是其他三层都需要引用他们。他们之间的引用关系如下图:

 

 

由于我们用到了开源框架,所以需要在WEB层的BIN中添加相关.DLL文件,Spring.Aop.dll,Spring.Core.dll这两个文件用于SPRING.NET的使用支持。IBatisNet.Common.dll,IBatisNet.DataMapper 是Ibatis.net的支持文件,log4net.dll是LOG4NET的支持文件。其他层中要使用这些组件,只需要添加引用就即可。

 

有了DLL文件引用之后还需要对他们配置,对于spring.net, ibatis.net来说,配置有两方面内容,一是让我们的.NET环境能使用他们,另外就是具体的使用内容配置,也就是说他们的功能性配置。 对spring.net的环境配置比较简单。Web.config中添加如下配置。

View Code
<configSections>    
    
<sectionGroup name="spring">
      
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    
</sectionGroup>
  
</configSections>

  
<spring>    
    
<!--Spring容器初始化-->
    
<context>
      
<resource uri="D:\\MyCode\\Spring\\Config\\Objects.xml"/>
    
</context>
    
  
</spring>

然后就可以在代码中利用容器获取初始化的对象了。(spring.net使用可以参考相关牛人内容)

 

在这个架构中,我主要用SPRING初始化了一个日志类,然后将他注入到数据层和业务逻辑层的每个类中方便这些类使用日志。然后在业务逻辑类中注入了一个默认的数据层操作类方便操作数据,比如说,我要在ProductBLL.cs中插入一个商品,那一定会用ProductDA.cs,但是我有不想写死(扩展替换方便),那么我就在它的父类(BaseBLL.cs 该类也是所有业务层类的父类)中申明一个属性注入点,如下代码:

 

View Code
        #region 属性注入区

        
/// <summary>
        
/// DA对应操作类
        
/// </summary>
        public BaseDA Access { getset; }

        
/// <summary>
        
/// 日志记录器
        
/// </summary>
        public ISysLog Logger { getset; }

        
#endregion
    }

属性类型BaseDA 是DA层的基类。该基类使用IBATIS操作数据,实现了一些常用操作,它也有一些注入点需要注入相关内容。

 

然后我在spring.net的对象申明配置中如下定义

View Code
<?xml version="1.0" encoding="utf-8" ?>

    
<objects xmlns="http://www.springframework.net">
      
<description>一个简单的控制反转例子</description>

      
<!--定义日志类-->
      
<object id="SysLog" type="Common.SysLog">
        
<property  name="ConfigUri" value="D:\\MyCode\\Spring\\Config\\log4net.config"/>
      
</object>   
      
      
<!--DA注入-->                           
      
<object id="BaseDA" type="DataAccess.BaseDA" abstract="true">
        
<property  name="Logger" ref="SysLog"/>
        
<property  name="SqlMapConfigUri" value="D:\\MyCode\\Spring\\Config\\sqlmap.config"/>
      
</object>
      
      
<object id="OrderDA" type="DataAccess.OrderDA" parent="BaseDA">
        
<property  name="MapName" value="Order"/>
      
</object>
      
      
<object id="ProductDA" type="DataAccess.ProductDA" parent="BaseDA">
        
<property  name="MapName" value="Product"/>
      
</object>

      
<!--Business注入-->
      
<object id="BaseBLL" type="Business.BaseBLL" abstract="true">
        
<property  name="Logger" ref="SysLog"/>
      
</object>
      
      
<object id="OrderBLL" type="Business.OrderBLL" parent="BaseBLL">
        
<property  name="Access" ref="OrderDA"/>
      
</object>

      
<object id="ProductBLL" type="Business.ProductBLL" parent="BaseBLL">
        
<property  name="Access" ref="ProductDA"/>
      
</object>
    
</objects>

如此就可以在配置中注入DA类。

具体代码如下可得:点我 下载!

posted on 2011-03-07 14:10  老金  阅读(3081)  评论(9编辑  收藏  举报