惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - Daniel Pang

pcanywhere失去连接的一个解决方法 JS格式化日期字符串 - Daniel Pang - 博客园 [软件共享]将数据库中的数据导出为SQL脚本 对文件下载的补充 - Daniel Pang - 博客园 复制DataTable的一种方法 IBatisNet + Castle 开发相关文章 [IBatisNet]关于返回DataTable的一点问题 深圳电话订票基本步骤及所有的取票点地址电话 Automatic Transaction Management Facility 使用 - Daniel Pang IBatisnet Facility 的几种配置 - Daniel Pang IBatisNet -- 保护你的配置文件及映射文件信息 Rational Rose 加载出错的问题 修改Sql server中列的属性脚本 字符串加密方法 ERP术语 英文对照(部分)(参考) 一个关于SQL2005的问题 动态加载TreeNode -- ComponentArt TreeView - Daniel Pang JS--屏蔽浏览器右键菜单 Excel的导出操作 - Daniel Pang - 博客园
使用IBatisNet + Castle 开发DotNet软件
Daniel Pang · 2007-01-04 · via 博客园 - Daniel Pang

        本文主要讲述我在项目中如何使用IBatisNet + Castle的结构来进行开发的。软件的主框架如下图:

       我将系统分为五层,分别是Domain,Persistence,Service,Component,Web。系统的分层参考了NPetShop2的结构并稍加简化。下面简单说明一下每一层的功能:

Domain -- 业务实体层
Persistence -- 持久层,负责数据访问
Service -- 服务层,调用持久层方法并实现业务逻辑
Web -- 最终展现给客户的Web界面,调用Service层方法
Componet -- 主要包括一些通用的方法等

      系统使用了Castle.Facilities,Castle.IOC以及IBatisNet,IBatisNet的DataMapper是通过Castle来管理的,下面分别介绍每一部分的配置及使用:

一、IBatisNet的配置
        参见:

IBatisNet1.5--配置篇

二、IBatisNet Facility 和 AutomaticTransactionManagement Facility配置

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

  
<facilities>

    
<facility id="ibatis" type="Castle.Facilities.IBatisNetIntegration.IBatisNetFacility, Castle.Facilities.IBatisNetIntegration" >
      
<sqlMap id="sqlServerSqlMap" config="SqlMap.config" />
    
</facility>

    
<facility id="transaction" type="Castle.Facilities.AutomaticTransactionManagement.TransactionFacility, Castle.Facilities.AutomaticTransactionManagement" />

  
</facilities>

</configuration>

三、IOC的配置

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

  
<components>
    
<component
            
id="insititution"
            service
="FES.Service.Interfaces.IInstitutionService, FES.Service"
            type
="FES.Service.InsititutionService, FES.Service" />
  
</components>

</configuration>

目前IOC的配置还可支持泛型,详细请参考:
福 娃    [Castle]Castle也范型

当这些配置文件都写好之后,我们还需将其加载到Castle容器当中,具体的代码可写在Global.asax文件。

Global

这样我们的配置才算完成,然后可以在代码中使用这些组件了。

四、将asp.net页面加入到Castle容器中

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

using System.Web;
using System.Web.Security;
using System.Reflection;
using System.Data;
using System.Configuration;
using Castle.Core;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;

namespace FES.Component
{
    
/// <summary>
    
/// 为将ASP.NET页面添加到Castle容器中而建立的类,所有页面必须继承此类
    
/// </summary>

    public class PageBase : System.Web.UI.Page
    
{
        
protected BindingFlags BINDING_FLAGS_SET
                    
= BindingFlags.Public
                    
| BindingFlags.SetProperty
                    
| BindingFlags.Instance
                    
| BindingFlags.SetField
                    ;

        
protected override void OnInit(EventArgs e)
        
{
            IWindsorContainer container 
= ObtainContainer();

            Type type 
= this.GetType();

            PropertyInfo[] properties 
= type.GetProperties(BINDING_FLAGS_SET);

            
foreach (PropertyInfo propertie in properties)
            
{
                
string pname = propertie.Name;

                
if (container.Kernel.HasComponent(pname))
                
{
                    propertie.SetValue(
this, container[pname], null);
                }

            }


            
base.OnInit(e);
        }



        
public IWindsorContainer ObtainContainer()
        
{

            IContainerAccessor containerAccessor 
=

            HttpContext.Current.ApplicationInstance 
as IContainerAccessor;
            
if (containerAccessor == null)
            
{
                
throw new ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性");
            }


            IWindsorContainer container 
= containerAccessor.Container;
            
if (container == null)
            
{
                
throw new ApplicationException("HttpApplication 得不到容器的实例");
            }

            
return container;
        }

    }

}

 

五、从Castle容器中得到ISqlMapper的实例
       本系统将IBatisNet交给Castle来管理,所以ISqlMapper的实例也必须从Castle容器中获取,这样Castle才能真正的管理IBatisNet。
       首先我们需要一个得到容器实例的方法:

/// <summary>
        
/// Obtain the Windsor container.
        
/// </summary>
        
/// <returns></returns>

        public static IWindsorContainer GetContainer()
        
{
            IContainerAccessor containerAccessor 
= HttpContext.Current.ApplicationInstance as IContainerAccessor;

            
if (containerAccessor == null)
            
{
                
throw new ApplicationException("你必须在HttpApplication中实现接口 IContainerAccessor 暴露容器的属性");
            }


            IWindsorContainer container 
= containerAccessor.Container;

            
if (container == null)
            
{
                
throw new ApplicationException("HttpApplication 得不到容器的实例");
            }


            
return container;
        }

从容器中获得ISqlMapper实例的方法:

/// <summary>
        
/// IsqlMapper实例,从Castle容器中获取
        
/// </summary>
        
/// <returns></returns>

        public static ISqlMapper sqlMap = (ContainerAccessorUtil.GetContainer())["sqlServerSqlMap"as ISqlMapper;
        

其中"sqlServerSqlMap"即是在我们配置IBatisNet Facility时指定的。

五、在Service层中使用事务处理

using System;
using System.Collections.Generic;
using System.Text;

using FES.Persistence;
using FES.Model;
using FES.Service.Interfaces;

using Castle.Services.Transaction;
using Castle.Facilities.IBatisNetIntegration;

namespace FES.Service
{
    [Transactional]
    [UsesAutomaticSessionCreation]
    
public class InsititutionService : IInstitutionService
    
{
        
IInstitutionService Members
    }

}

写的很简单,希望高手指点。。。