当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪WCF: 服务操作重载      一直以来,我只知道WCF的服务是可以重载,但是却不知如何实现。今朝已验证,实现并不难,并自我感慨,此重载意义不大。1. 只需要更改服务契约(标注了特性ServiceContract的接口/类)里的.........
    ▪Castle~动态代理实现对方法的拦截      昨天写了关于使用Castle.Windsor来实现IOC功能,今天需要写一下使用Castle实现对方法的拦截,这实事上是.net平台实现AOP编程的基础,当你可以对方法进行拦截时,你就可以动态地干很多.........
    ▪Castle~实现IoC容器      IOC的容器确实不少,unity,autofac,Castle 等等,前两种组件如何实现IOC在我之前的文章中已经做过说明了,今天主要来说一下Castle如何去实现IoC,事实上Castle是小微的一个开源项目,最早接触.........

[1]WCF: 服务操作重载
    来源:    发布时间: 2013-10-28

一直以来,我只知道WCF的服务是可以重载,但是却不知如何实现。

今朝已验证,实现并不难,并自我感慨,此重载意义不大。

1. 只需要更改服务契约(标注了特性ServiceContract的接口/类)里的重载方法的操作契约特性(OperationContract)。如下代码所示:

1 [ServiceContract]
2 public interface IMethodOverLoadTest {
3 [OperationContract(Name="SumInt")]
4 int Sum (int a, int b);
5
6 [OperationContract(Name="SumDouble")]
7 double Sum (double a, double b);
8 }

注:1. 客户端向服务端请求时,终节点的筛选器会根据客户端的请求消息内容去找到相应的方法。2. 在客户端调用服务端的此Sum方法时,不再是平时的写法"client.Sum(1, 2) / client.Sum(1.0, 2.0)",VS的提示框只有"client.SumInt(1, 2) / client.SumDouble(1.0, 2.0)"。也就是说,暴露到客户端的方法名是OperationContract的名称,只是我们平时不会去给OperationContract定义它的“Name=”,所以在不定义时默认为方法名。 这就是为什么我一开始说的,“此重载意义不大”

 

本文链接


    
[2]Castle~动态代理实现对方法的拦截
    来源:    发布时间: 2013-10-28

昨天写了关于使用Castle.Windsor来实现IOC功能,今天需要写一下使用Castle实现对方法的拦截,这实事上是.net平台实现AOP编程的基础,当你可以对方法进行拦截时,你就可以动态地干很多事,如在方法执行前做权限验证,执行后到日志记录,异常处理等等,怎么样看到这里,胃口来了吧,呵呵,对于技术痴迷者来说,这是正常的,好了,说干就干!

前言:我们在开发项目时,你的项目可能已经上线运营了,内部的代码如果修改风险是很大的,这当然也不符合OCP了,你这前的代码在运营过程中已经将BUG修改完成,运行很稳定,但这时,你的BOSS要求你在方法操作之前做一下验证,这时,你怎么办?

方法1:改原来的方法,风险呀,原则呀!

这当然不是我们推荐的方法,它的风险性是可想而知的,你修改自己的代码还好,如果是修改别人写的代码,那麻烦就更大了,呵呵。

方法2:使用动态代理Castle,dynamic proxy在java中已经不是新鲜事物了,但在.net中还是比较少见的技术,实现的组件也不多

这虽然有些复杂度,但听起来不错,值得尝试,事实上在小微的orchard项目中早已经开始使用它了,功能模块的动态插拔确实需要这样一种技术。

实现:

一个用户业务类,它在运行过程中很稳定,代码如下:

1   public interface IUserBLL
2 {
3 void GetUser(string pre);
4 }
5
6 public class UserBLL : IUserBLL
7 {
8 public virtual void GetUser(string pre)
9 {
10 Console.WriteLine(pre + ",GSpring");
11 }
12
13 }

但在项目二期工程中,BOSS要求在这个GetUser 方法执行之前,要验证一个用户的权限,如果满足要求才能被用户列表,这时,我们有了castle

就可以不修改上面的代码了(注意要被代理的方法必须是virtual虚方法,因为它会被代理类重写(override)的,呵呵 )。

为GetUser方法加权限了,代码如下:

1 /// <summary>
2 /// Summary description for DaoProxy.
3 /// </summary>
4 public class UserRoleInterceptorProxy : IInterceptor
5 {
6 string _arg;
7 public UserRoleInterceptorProxy(string arg)
8 {
9 _arg = arg;
10 }
11 public void Intercept(IInvocation invocation)
12 {
13 //这里可以进行数据库连接、日志、异常处理、权限判断等共通操作
14 //Console.WriteLine("{0}方法调用之前", _arg);
15 //invocation.Proceed();//处理被代理的部分
16 //Console.WriteLine("{0}方法调用之后", _arg);
17 if (_arg == "zzl") //这里可以写你的验证逻辑
18 invocation.Proceed();//处理被代理的部分
19 else
20 Console.WriteLine("{0}您没有操作的权限", _arg);
21
22 }
23
24 }

在使用GetUser方法的地方,要被重写为:

1      #region Dynamic Proxy
2 var proxyGenerator = new ProxyGenerator();
3 var handler = new UserRoleInterceptorProxy[] { new UserRoleInterceptorProxy("zhz") };
4 IUserBLL iRole = proxyGenerator.CreateClassProxy<UserBLL>(handler);
5 iRole.GetUser("zzl");
6 #endregion

程序运行的结果为:


    
[3]Castle~实现IoC容器
    来源:    发布时间: 2013-10-28

IOC的容器确实不少,unity,autofac,Castle 等等,前两种组件如何实现IOC在我之前的文章中已经做过说明了,今天主要来说一下Castle如何去实现IoC,事实上Castle是小微的一个开源项目,最早接触它是在orchard项目中,在orchard里主要用在动态代理方法拦截上,当然这是castle最重要的作用,事实上它当然也可以实现IoC了,不过,你要下载一个Castle.Windsor.dll,它主要实现ioc功能的。

说干就干,事情和前两个组件的工作场景是相似的,一个irepository,多种实现方式,ef,linq,nhibernate,ado.net等等,你可以根据你的需要去实现它,这只是最大层次上的多态,代码可能是这样:

泛型类版本

1 #region 泛型注入
2 public interface IRepository<T>
3 {
4 void Insert(T entity);
5 }
6
7 public class EFRepository<T> : IRepository<T>
8 {
9 #region IRepository<T> 成员
10
11 public void Insert(T entity)
12 {
13 Console.WriteLine("EFRepository泛型注入" + entity);
14 }
15
16 #endregion
17 }
18 #endregion

非泛型版本(泛型方法版本)

1 #region 非泛型注入
2 public interface IRepository
3 {
4 void Insert<T>(T entity);
5 }
6
7 public class EFRepository : IRepository
8 {
9 #region IRepository<T> 成员
10
11 public void Insert<T>(T entity)
12 {
13 Console.WriteLine("EFRepository非泛型注入" + entity);
14 }
15
16 #endregion
17 }
18
19 public class LINQRespository : IRepository
20 {
21 #region IRepository<T> 成员
22
23 public void Insert<T>(T entity)
24 {
25 Console.WriteLine("LINQRepository非泛型注入" + entity);
26 }
27
28 #endregion
29 }
30 #endregion

对于这两种类型,在castle配置上也略有不同,看代码:

<component id="非泛型" service="Test.IRepository,Test" type="Test.EFRepository,Test" />
<component id="泛型" service="Test.IRepository`1,Test" type="Test.EFRepository`1,Test" />

上面的代码是架构层次的,而对于具体的业务,如用户方面的业务可能有多个版本的考虑,可能有代缓存的,不代缓存的,可能有发邮件的,也可能有发短信的,这是具体业务层次的多态,代码可能是这样的:

1 #region 服务是泛型,类型不是泛型
2
3 public interface IMessageService<T>
4 {
5 void Sending(T entity);
6 }
7 public class UserService : IMessageService<User>
8 {
9
10
11 #region IMessageService<User> 成员
12
13 public void Sending(User entity)
14 {
15 Console.WriteLine("用户模块发消息,采用E-Mail方式");
16 }
17
18
    
最新技术文章:
▪C#通过IComparable实现ListT.sort()排序
▪C#实现对Json字符串处理实例
▪Winform实现抓取web页面内容的方法
▪Winform实现将网页生成图片的方法
▪C#控制台程序中处理2个关闭事件的代码实例
▪WinForm实现同时让两个窗体有激活效果的特效...
▪WinForm实现拦截窗体上各个部位的点击特效实...
▪用C#的params关键字实现方法形参个数可变示例
▪C#判断某程序是否运行的方法
▪C#验证码识别基础方法实例分析
▪C#通过WIN32 API实现嵌入程序窗体
▪C#实现获取鼠标句柄的方法
▪C#事件处理和委托event delegate实例简述
▪C#获取程序文件相关信息的方法
▪C#中的除法运算符与VB.NET中的除法运算符
▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
▪Base64编码解码原理及C#编程实例
▪C#实现的优酷真实视频地址解析功能(2014新算...
▪C#和SQL实现的字符串相似度计算代码分享
▪C#使用Word中的内置对话框实例
▪C#反射之基础应用实例总结
▪C#生成单页静态页简单实例
▪C#实现SMTP邮件发送程序实例
▪C#实现随鼠标移动窗体实例
▪C#使用GDI+创建缩略图实例
▪C#实现通过模板自动创建Word文档的方法
▪C#中Response.Write常见问题汇总
▪C#中多态、重载、重写区别分析
▪WinFrom中label背景透明的实现方法
▪C#中out保留字用法实例分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3