.net企业级架构实战框架综述
2008-08-18 00:48
253 查看
spring.net是java下大名鼎鼎的spring框架移植到.net的开源项目,且借助于.net强大的反射机制,甚至拥有比原java版本更强大的功能。
那它能用来做什么呢?核心功能就是IOC和AOP:
IOC(Inversion of Control),字面意思为“反转控制”,我更倾向于理解为“依赖注入”,意思就是说:在基于接口开发的情况下,我们会对需要的业务处理对象(数据访问,业务逻辑等)一一做上接口,前端使用时只是对接口的调用,而并不关心具体是什么类具体去实现了这个接口~听起来似乎不可能,是的,如果没有IOC,这是不可能的事情,我们的前端逻辑和后端实现是紧紧耦合的,做页面开发的人必须知道哪一个类(.cs文件)拥有哪些方法,即便是基于接口,我们也依然要在程序里去实例化它,形如:
Code
IManager mgr = new DataManager();
无形中,基于接口开发成了鸡肋,前端开发人员几乎要知道一条龙的编码流程才能做业务开发!(当然,有的项目就是一个人在做)
好吧,那就使用IOC,它是怎么解开这个耦合关系的?
IOC框架一般会维护一个配置文件,它大概要完成的使命是:
1、将实现接口的对象进行列表,表示它们是被页面需要的;
2、把页面的以基于URL的形式进行列表,表示它们是需求方。
余下的事情,是框架来进行协调,在页面上声明一下某一个接口的对象,在它需要实例化时,IOC框架会自动将对应的接口实现进行注入。如下就是一个Spring.net的配置范例片断:
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using woodigg.model;
using woodigg.DAO;
using Spring.Aop;
using AopAlliance.Intercept;
namespace woodigg.bll
{
/// <summary>
/// 环绕通知
/// </summary>
public class whenUserSaveAdvice : IMethodInterceptor
{
public object Invoke(IMethodInvocation invocation)
{
User user = (User)invocation.Arguments[0];
Logger.ErrorLog(invocation.Method.Name, user.Name, user.Name);
//真正的调用目标方法,并得到返回值
Object obj = invocation.Proceed();
return obj;
}
}
}
这一代码片断实现的功能是:如果发现系统中新增了一个用户(即User的业务管理器调用了Save方法),那么在日志系统中,存储一下用户名,让管理员可以在翻日志时知道谁又加入了~
当然,就这么一段代码并不能完成这个监控功能,同样的,我们必须做配置(Spring.net把开发提高到了对配置进行管理的境地,你在配置管理上花的时间,将大于以往,好处是更关注和贴近业务而不是代码),告诉AOP框架,我们希望监听哪些对象的哪些动作,以及监听到后我们要调用哪些模块来采取行动:
Code
<!--被代理的对象userDAO-->
<object id="userDAO" type="woodigg.DAO.UserDAO" singleton="false">
<constructor-arg type="woodigg.model.User">
<ref object="user"/>
</constructor-arg>
</object>
<!--切面通知-->
<object id="adviceSave" type="woodigg.bll.whenUserSaveAdvice,woodigg.bll" />
<!--切入点-->
<object id="advisor"
type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor,Spring.Aop">
<property name="MappedNames">
<list>
<value>save*</value>
</list>
</property>
<property name="advice" ref="adviceSave" />
</object>
<!--代理对象-->
<object id="proxyUserDAO"
type="Spring.Aop.Framework.ProxyFactoryObject,Spring.Aop">
<property name="proxyInterfaces">
<value>woodigg.Interface.DAO.IUserDAO</value>
</property>
<property name="interceptorNames">
<list>
<value>advisor</value>
</list>
</property>
<property name="target">
<ref object="userDAO" />
</property>
</object>
也许这样的配置片断更让人犯晕,没关系,习惯了就好,有些事情需要我们自己去做(DB,ENTITY,DAO,BLL开发),有些事情需要的是我们去理解(AOP框架,通知,切面,代理对象),相信不需要多长时间,这些都不是问题。
关于IOC和AOP,以上只是寥寥几笔带过,在以后的实例系列中,将各个击破
实例主要围绕的是一个音乐网站的搭建(有点儿像AllMusic内样的,而不同于别的什么无聊SNS社区),会涉及的内容是:Spring.net、nHibernate、codeSmith模板、多对多表结构、Castle MonoRail(虽然有人强建不建议把MonoRail集成到Spring.net中,但我至今没找到.net 2.0下好的MVC解决方案,用用MonoRail有助于更好理解MVC,优化性能)。
那它能用来做什么呢?核心功能就是IOC和AOP:
IOC(Inversion of Control),字面意思为“反转控制”,我更倾向于理解为“依赖注入”,意思就是说:在基于接口开发的情况下,我们会对需要的业务处理对象(数据访问,业务逻辑等)一一做上接口,前端使用时只是对接口的调用,而并不关心具体是什么类具体去实现了这个接口~听起来似乎不可能,是的,如果没有IOC,这是不可能的事情,我们的前端逻辑和后端实现是紧紧耦合的,做页面开发的人必须知道哪一个类(.cs文件)拥有哪些方法,即便是基于接口,我们也依然要在程序里去实例化它,形如:
Code
IManager mgr = new DataManager();
无形中,基于接口开发成了鸡肋,前端开发人员几乎要知道一条龙的编码流程才能做业务开发!(当然,有的项目就是一个人在做)
好吧,那就使用IOC,它是怎么解开这个耦合关系的?
IOC框架一般会维护一个配置文件,它大概要完成的使命是:
1、将实现接口的对象进行列表,表示它们是被页面需要的;
2、把页面的以基于URL的形式进行列表,表示它们是需求方。
余下的事情,是框架来进行协调,在页面上声明一下某一个接口的对象,在它需要实例化时,IOC框架会自动将对应的接口实现进行注入。如下就是一个Spring.net的配置范例片断:
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using woodigg.model;
using woodigg.DAO;
using Spring.Aop;
using AopAlliance.Intercept;
namespace woodigg.bll
{
/// <summary>
/// 环绕通知
/// </summary>
public class whenUserSaveAdvice : IMethodInterceptor
{
public object Invoke(IMethodInvocation invocation)
{
User user = (User)invocation.Arguments[0];
Logger.ErrorLog(invocation.Method.Name, user.Name, user.Name);
//真正的调用目标方法,并得到返回值
Object obj = invocation.Proceed();
return obj;
}
}
}
这一代码片断实现的功能是:如果发现系统中新增了一个用户(即User的业务管理器调用了Save方法),那么在日志系统中,存储一下用户名,让管理员可以在翻日志时知道谁又加入了~
当然,就这么一段代码并不能完成这个监控功能,同样的,我们必须做配置(Spring.net把开发提高到了对配置进行管理的境地,你在配置管理上花的时间,将大于以往,好处是更关注和贴近业务而不是代码),告诉AOP框架,我们希望监听哪些对象的哪些动作,以及监听到后我们要调用哪些模块来采取行动:
Code
<!--被代理的对象userDAO-->
<object id="userDAO" type="woodigg.DAO.UserDAO" singleton="false">
<constructor-arg type="woodigg.model.User">
<ref object="user"/>
</constructor-arg>
</object>
<!--切面通知-->
<object id="adviceSave" type="woodigg.bll.whenUserSaveAdvice,woodigg.bll" />
<!--切入点-->
<object id="advisor"
type="Spring.Aop.Support.NameMatchMethodPointcutAdvisor,Spring.Aop">
<property name="MappedNames">
<list>
<value>save*</value>
</list>
</property>
<property name="advice" ref="adviceSave" />
</object>
<!--代理对象-->
<object id="proxyUserDAO"
type="Spring.Aop.Framework.ProxyFactoryObject,Spring.Aop">
<property name="proxyInterfaces">
<value>woodigg.Interface.DAO.IUserDAO</value>
</property>
<property name="interceptorNames">
<list>
<value>advisor</value>
</list>
</property>
<property name="target">
<ref object="userDAO" />
</property>
</object>
也许这样的配置片断更让人犯晕,没关系,习惯了就好,有些事情需要我们自己去做(DB,ENTITY,DAO,BLL开发),有些事情需要的是我们去理解(AOP框架,通知,切面,代理对象),相信不需要多长时间,这些都不是问题。
关于IOC和AOP,以上只是寥寥几笔带过,在以后的实例系列中,将各个击破
实例主要围绕的是一个音乐网站的搭建(有点儿像AllMusic内样的,而不同于别的什么无聊SNS社区),会涉及的内容是:Spring.net、nHibernate、codeSmith模板、多对多表结构、Castle MonoRail(虽然有人强建不建议把MonoRail集成到Spring.net中,但我至今没找到.net 2.0下好的MVC解决方案,用用MonoRail有助于更好理解MVC,优化性能)。
相关文章推荐
- .net企业级架构实战之1——框架综述
- .net企业级架构实战之1——框架综述
- .net企业级架构实战之1——框架综述
- .net企业级架构实战框架综述
- DotNet企业级架构实战之1——框架综述
- net企业级架构实战之1——框架综述【精华】
- .net企业级架构实战之7——Spring.net整合Asp.net mvc
- 基于.NET平台的分层架构实战(一)——综述
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- .net企业级架构实战之6——Spring.net管理web services
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- 基于.NET平台的分层架构实战(一) 综述
- .net企业级架构实战之7——Spring.net整合Asp.net mvc
- 基于.NET平台的分层架构实战(一)——综述
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- .net企业级架构实战之2——Spring.net对象装配
- .net企业级架构实战之6——Spring.net管理web services
- .net企业级架构实战之6——Spring.net管理web services
- 基于.NET平台的分层架构实战(九)——数据访问层的第三种实现:基于NBear框架的ORM实现
- 基于.NET平台的分层架构实战(九)—数据访问层的第三种实现:基于NBear框架的ORM实现