.net企业级架构实战之1——框架综述

 

spring.net是java下大名鼎鼎的spring框架移植到.net的开源项目,且借助于.net强大的反射机制,甚至拥有比原java版本更强大的功能。

 

那它能用来做什么呢?核心功能就是IOC和AOP:

 

IOC(Inversion of Control),字面意思为“反转控制”,我更倾向于理解为“依赖注入”,意思就是说:在基于接口开发的情况下,我们会对需要的业务处理对象(数据访问,业务逻辑等)一一做上接口,前端使用时只是对接口的调用,而并不关心具体是什么类具体去实现了这个接口~听起来似乎不可能,是的,如果没有IOC,这是不可能的事情,我们的前端逻辑和后端实现是紧紧耦合的,做页面开发的人必须知道哪一个类(.cs文件)拥有哪些方法,即便是基于接口,我们也依然要在程序里去实例化它,形如:

 


IManager mgr = new DataManager();

 

无形中,基于接口开发成了鸡肋,前端开发人员几乎要知道一条龙的编码流程才能做业务开发!(当然,有的项目就是一个人在做)

好吧,那就使用IOC,它是怎么解开这个耦合关系的?

IOC框架一般会维护一个配置文件,它大概要完成的使命是:

1、将实现接口的对象进行列表,表示它们是被页面需要的;

2、把页面的以基于URL的形式进行列表,表示它们是需求方。

余下的事情,是框架来进行协调,在页面上声明一下某一个接口的对象,在它需要实例化时,IOC框架会自动将对应的接口实现进行注入。如下就是一个Spring.net的配置范例片断:

 


  <!--业务相关-->
  <object id="ArtistDaoSpring" type="woodigg.DAO.ArtistDaoSpring,woodigg.DAO" autowire="byName" />

  <!--页面调用-->
  <object type="~/Admin/Artist/MgrArt.aspx" autowire="byName" />

 

再看看页面里的声明和调用片断:

 


using System;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using woodigg.model;
using woodigg.Interface.DAO;
using woodigg.bll.Tool;
using Spring.Context;
using Spring.Context.Support;

public partial class Admin_Artist_MgrArt : AdminPage
{
    #region 注入对象
    private IArtistDAO _ArtistDaoSpring;
    public IArtistDAO ArtistDaoSpring
     {
        get { return _ArtistDaoSpring; }
        set { _ArtistDaoSpring = value; }
     }
    #endregion

    protected void Page_Load(object sender, EventArgs e)
     {
        GridView1.DataSource =ArtistDaoSpring.GetAllArtists();
        GridView1.DataBind();
     }
}

 

如果是初次接触IOC,可能理解起来会有些生涩,毕竟是个基于配置的框架,有些东西需要深入了解,这个以后可以一步步探个究竟。OK,接着就是AOP。

 

那么AOP又是做什么的呢?Aspect Oriented Programming,字面意思即为“面向切面的编程”。Aspect,就是切面,代表了我们很多项目中重复开发的模块,如邮件功能,日志功能等。

说起来是会让人很颓废的,我们花费在重复劳动上的时间,有时太多了。这个项目写日志,下一个还写日志,日志有区别吗?答案是没有,但它就是需要,哪怕是复制粘贴,还是需要!被需要当然是好事,说明它存在的价值,但能否把这样的东西做成一个组件,以后拿来就用,并且与新的项目系统人我两不犯,无缝集成?

当然是可以的,AOP在此时的价值会得到充分的体现。就我个人而言,对它的理解,更多的是一个监听器,侦测你的业务是否有相关的需要,只要你有需要发出,AOP框架就会在你需要的地方设一个断点,进行功能模块的切入,让它去做你希望它做的事。就这么神奇~

这里放出一个代码片断,小小注解一下以上比较让人头晕的概念:

 

 


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框架,我们希望监听哪些对象的哪些动作,以及监听到后我们要调用哪些模块来采取行动:

 

 


  <!--被代理的对象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,以上只是寥寥几笔带过,在以后的实例系列中,将各个击破

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程通过实际项目融入常用开发技术架构,讲授风格独特,提供详细上课日志及答疑,赠送配套的项目架构源码注释详细清晰且表达通俗,均能直接在实际项目中应用,正真的物超所值,价格实惠任务作业:综合运用《C#/.Net企业级系统架构设计实战精讲教程》课程所学知识技能设计一个学生成绩管理系统的架构。要求:1.系统基于MVC的三层架构,各层单独建不同的解决方案文件夹。2.采用Model First开发方式,设计架构时只需要设计学生表(TbStudent)和课程表(TbCourse)。学生表必须有的字段是ID、stuName、age;课程表必须有的字段是ID、courseName、content。3.数据访问层采用Entity Framework或NHibernate来实现,必须封装对上述表的增删改查方法。4.必须依赖接口编程,也就是必须要有数据访问层的接口层、业务逻辑层的接口层等接口层。层层之间必须减少依赖,可以通过简单工厂或抽象工厂。5.至少采用简单工厂、抽象工厂、Spring.Net等技术中的2种来减少层与层之间的依赖等。6.封装出DbSession类,让它拥有所有Dal层实例和SaveChanges方法。7.设计出数据访问层及业务逻辑层主要类的T4模板,以便实体增加时自动生成相应的类。8.表现层要设计相关的控制器和视图来验证设计的系统架构代码的正确性,必须含有验证增删改查的方法。9.开发平台一定要是Visual Studio平台,采用C#开发语言,数据库为SQL Server。10.提交整个系统架构的源文件及生成的数据库文件。(注意: 作业需写在CSDN博客中,请把作业链接贴在评论区,老师会定期逐个批改~~)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值