Spring.net架构示例(含Aop和Ioc)源码
最近写了一个Spring.net的架构。
一、架构主图

架构图的数据流程走向是:
UI层=》UILogic》=》Service》Business=》DataAccess
中间使用到的公共类库,如,Aop和Container
二、Default.aspx页面代码
<%@ Page Language="C#" AutoEventWireup="true" Inherits="ST.Spring.UILogic.UserManage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div
</div>
</form>
</body>
</html>
举一个ioc配置示例:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" >
<description>An example that demonstrates simple IoC features.</description>
<!-- 环绕通知 -->
<object id="UserAdvice" type="ST.Spring.Aop.UserAdvice,ST.Spring.Aop"></object>
<!-- UserBll class -->
<object id="IUserBll" type="Spring.Aop.Framework.ProxyFactoryObject">
<!-- 拦截目标 -->
<property name="target" ref="UserBll" />
<!-- 具体通知 -->
<property name="interceptorNames">
<list>
<value>UserAdvice</value>
</list>
</property>
</object>
<object id="UserBll" type="ST.Spring.Business.UserBll,ST.Spring.Business">
</object>
</objects>
IUserBll是接口名,继承了是Spring.Aop.Framework.ProxyFactoryObject的ProxyFactoryObject类,被UserBll引用或者说实现。UserBll继承了ST.Spring.Business.UserBll类。
一句话,ioc就是为了在.cs业务类中,通过接口名创建实现对象。
var userBll = ObjectContainer.CreateObject<IUserBll>();
三、UILogic页面的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ST.Spring.Container;
using ST.Spring.DataModel;
using ST.Spring.IService;
namespace ST.Spring.UILogic
{
public class UserManage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var userService = ObjectContainer.CreateObject<IUserService>();
User result = userService.AddUser(new User() { UserName = "xqh", Sex = "男", Password = "123" });
//Response.Write(user.Singleton() + "<br/>");
Response.Write("添加用户:" + (result != null ? "成功" : "失败") + "<br />");
////Response.Write(result.UserName + result.Sex + result.Password + "<br/>");
//Response.Write(user.SendMsg());
Response.End();
}
}
}
四、IService.cs和Service.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ST.Spring.DataModel;
namespace ST.Spring.IService
{
public interface IUserService
{
/// <summary>
/// 添加用户
/// </summary>
/// <param name="u"></param>
/// <returns></returns>
User AddUser(User u);
/// <summary>
/// 发送消息
/// </summary>
/// <returns></returns>
string SendMsg();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ST.Spring.Container;
using ST.Spring.DataModel;
using ST.Spring.IBusiness;
using ST.Spring.IService;
namespace ST.Spring.Service
{
/// <summary>
/// 用户service
/// </summary>
public class UserService : IUserService
{
private IUserBll UserBll { get; set; }
private string _msg;
private string _constructor;
//构造函数注入
public UserService(string constructor)
{
this._constructor = constructor;
}
//通过属性注入 相当于替代了 IUser _user = new UserDAO把这个过程交给容器来处理
/// <summary>
/// 消息内容通过属性注入
/// </summary>
public string MsgInfo
{
get { return this._msg; }
set { this._msg = value; }
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="u"></param>
/// <returns></returns>
public User AddUser(User u)
{
var userBll = ObjectContainer.CreateObject<IUserBll>();
return userBll.AddUser(u);
}
/// <summary>
/// 发送消息
/// </summary>
/// <returns></returns>
public string SendMsg()
{
return "注入的MsgInfo值是:" + MsgInfo + "<br/>" + "_constructor通过构造函数注入的值:" + _constructor;
}
}
}
五、Aop类UserAdvice.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AopAlliance.Intercept;
namespace ST.Spring.Aop
{
/// <summary>
/// 环绕通知
/// </summary>
public class UserAdvice : IMethodInterceptor
{
#region IMethodInterceptor 成员
public object Invoke(IMethodInvocation invocation)
{
string methodName = invocation.Method.Name;
//可以拦截方法进行日志、权限等操作
if (methodName == "AddUser")
{
//throw new Exception(invocation.Method.Name);
}
object returnValue = invocation.Proceed();
//return "被拦截的方法:" + methodName + "<br/>" + "返回的值:" + returnValue.ToString();
return returnValue;
}
#endregion
}
}
六、IOC容器创建类ObjectContainer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Spring.Context;
using Spring.Context.Support;
namespace ST.Spring.Container
{
public static class ObjectContainer
{
//使用自定义的配置文件---获取容器
private static IApplicationContext Ctx { get; set; }
public static TObject CreateObject<TObject>()
{
Ctx = new XmlApplicationContext(string.Format("~/SpringConfig/{0}.xml", typeof(TObject).Assembly.GetName().Name));
var str = string.Empty;
var t = typeof(TObject).FullName;
if (t.LastIndexOf('.') > 0)
{
str = t.Substring(t.LastIndexOf('.') + 1, t.Length - t.LastIndexOf('.') - 1);
}
return (TObject)Ctx.GetObject(str);
}
}
}
创建方法如下:
var userService = *OBJECTCONTAINER.CREATEOBJECT<IUSERSERVICE>();*
User result = userService.AddUser(new User() { UserName = "xqh", Sex = "男", Password = "123" });
下载:http://pan.baidu.com/s/1hqCGuFU
Spring.net架构示例(含Aop和Ioc)源码的更多相关文章
- Spring IOC 源码分析
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文 ...
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...
- Spring IoC源码解析之getBean
一.实例化所有的非懒加载的单实例Bean 从org.springframework.context.support.AbstractApplicationContext#refresh方法开发,进入到 ...
- Spring IoC 源码分析 (基于注解) 之 包扫描
在上篇文章Spring IoC 源码分析 (基于注解) 一我们分析到,我们通过AnnotationConfigApplicationContext类传入一个包路径启动Spring之后,会首先初始化包扫 ...
- Spring Ioc源码分析系列--Ioc源码入口分析
Spring Ioc源码分析系列--Ioc源码入口分析 本系列文章代码基于Spring Framework 5.2.x 前言 上一篇文章Spring Ioc源码分析系列--Ioc的基础知识准备介绍了I ...
- Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理
Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那么这一篇继续 ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- Spring Ioc源码分析系列--Bean实例化过程(二)
Spring Ioc源码分析系列--Bean实例化过程(二) 前言 上篇文章Spring Ioc源码分析系列--Bean实例化过程(一)简单分析了getBean()方法,还记得分析了什么吗?不记得了才 ...
随机推荐
- [Tommas] 如何创建自动化功能测试的基本原则
每个实行持续交付的项目,都有生产流水线的元素,如持续集成和自动化测试.这些测试是在不同层面进行的,从单元测试到冒烟测试再到功能测试.自动化功能测试的优点之一是可重复性和可预测的执行时间.出于这个原因, ...
- bzoj 1878 [SDOI2009]HH的项链(离线处理+BIT)
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此, 他的项链变 ...
- java中字符串切割的方法总结
StringTokenizer最快 ,基本已经不用了,除非在某些需要效率的场合.Scanner最慢. String和Pattern速度差不多.Pattern稍快些. String和Pattern的sp ...
- Codeforces 295C Greg and Friends
BFS+DP.dp[i][j][0]表示有i个50kg,j个100kg的人在左岸,dp[i][j][1]表示有i个50kg,j个100kg的人在右岸.用BFS求最短路的时候记录到达该状态的可能情况. ...
- 《算法:C语言实现》阅读笔记
//从今天起准备认真看完这本书.本渣虽然笨,但是窝懒啊.... //今天开始看第一章.希望坚持下去. 第一章 引言 通过讨论连通问题的几种算法,来引出算法的重要性. 1.1 连通问题的快速查找算法 感 ...
- Shell的那些事儿
日常工作中,哪种语言对你的帮助最大?我觉得非Shell莫属.最早接触Shell应该是在大学的时候,如做Linux文件系统裁减会用到一些命令,如find, tar, xargs, cp等等,并把它们通过 ...
- mmsql 查询每个分类的前3条数据
select * from (select *,row_number() over(partition by PropertyRoofBeamID order by PropertyRoomID de ...
- 【设计模式】单例设计模式的N中Java实现方法
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17359719 特点 单例模式的特点: 1.只能有一个实例: 2.必须自己创建自己的一个实例 ...
- SQL Server:OA权限管理设计的实现 下
SQL Server:OA权限管理设计的实现 下 OA系统权限管理设计方案 不同职责的人员,对于系统操作的权限应该是不同的.优秀的业务系统,这是最基本的功能. 可以对“组”进行权限 ...
- Eclipse导入Maven项目时class not found
用maven开发javaweb项目可以自动导包,可以在配置文件pom.xml中发现依赖包,今天在eclipse中导入maven项目,开启tomcat服务器时报错 class not found, 看到 ...