记录下学习过程中的jQuery知识点,非原创纯属笔记
1.基本选择器:#id(标签ID,特殊符号用//转义) .class(样式类名) 标签 (*表示所有,可以与类组合) 多个选择器(用逗号分割,将匹配元素合并到一个结果中)
2.层级选择器:目标选择器+关系+匹配选择器 关系有:空格:所有后代元素 >:子元素 +:紧接着目标元素 ~:同辈
3.属性选择器:[属性+匹配]:匹配:空白:所有 =:相等 !=:不等 ^=以开头 $=以结尾 *=包含
[属性选择器][属性选择器]:同时满足多个条件
4.
本文链接
昨天写了关于使用Castle.Windsor来实现IOC功能,今天需要写一下使用Castle实现对方法的拦截,这实事上是.net平台实现AOP编程的基础,当你可以对方法进行拦截时,你就可以动态地干很多事,如在方法执行前做权限验证,执行后到日志记录,异常处理等等,怎么样看到这里,胃口来了吧,呵呵,对于技术痴迷者来说,这是正常的,好了,说干就干!
前言:我们在开发项目时,你的项目可能已经上线运营了,内部的代码如果修改风险是很大的,这当然也不符合OCP了,你这前的代码在运营过程中已经将BUG修改完成,运行很稳定,但这时,你的BOSS要求你在方法操作之前做一下验证,这时,你怎么办?
方法1:改原来的方法,风险呀,原则呀!
这当然不是我们推荐的方法,它的风险性是可想而知的,你修改自己的代码还好,如果是修改别人写的代码,那麻烦就更大了,呵呵。
方法2:使用动态代理Castle,dynamic proxy在java中已经不是新鲜事物了,但在.net中还是比较少见的技术,实现的组件也不多
这虽然有些复杂度,但听起来不错,值得尝试,事实上在小微的orchard项目中早已经开始使用它了,功能模块的动态插拔确实需要这样一种技术。
实现:
一个用户业务类,它在运行过程中很稳定,代码如下:
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方法加权限了,代码如下:
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方法的地方,要被重写为:
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
程序运行的结果为:
学习C#中,闲来无事,用了一些基本语法码了个猜数字游戏!!献丑了!
代码如下:
2 {
3 int guess; // 待猜数
4 int min; // 范围最小值
5 int max; // 范围最大值
6 int input=0; // 保存玩家输入值
7 Random r = new Random(); // 随机对象,用于产生随机数
8 // 绘制游戏主界面
9 Console.WriteLine("*********************************************************************");
10 Console.WriteLine("* *");
11 Console.WriteLine("* 趣 味 猜 数 字 游 戏 *");
12 Console.WriteLine("* *");
13 Console.WriteLine("* 天天灬想 *");
14 Console.WriteLine("* *");
15 Console.WriteLine("********************************Joiy*********************************");
16 Console.WriteLine();
17 // 变量初始化
18 guess = r.Next(1, 100); // 产生1-100之间的随机整数
19
20 min = 1; // 初始范围最小值为1
21 max = 100; // 初始范围最大值为100
22
23 // 游戏开始
24 Console.WriteLine("待猜数已经生成,范围是:1至100\n");
25 //Console.Write("现在输入您认为正确的值:");
26 while (guess != input)//进入while循环,当条件满足时退出!
27 {
28 Console.Write("现在输入您认为正确的值:");
29 //通过try……catch捕获输入值是否非法!
30 try
31 {
32 input = Convert.ToInt32(Console.ReadLine());
33 }
34 catch (Exception ex)
35 {
36 Console.WriteLine(ex.Message);//打印输出错误描述
37 }
38 if (input > guess)//输入值若大于待猜值,则将最大值更新为输入值,缩小待猜范围。
39 {
40 max = input;
41 //Console.WriteLine("错误!");
42 }
43 else if (input < guess)//输入值若小于待猜值,则将最小值更新为输入值,缩小待猜范围。
44 {
45 min = input;
46 }
47
48 Console.WriteLine("错误!待猜值范围变更为:{0}……至……{1}", min, max);
49 }
50 Console.WriteLine("恭喜,数字{0}正确!",guess);
51 Console.ReadKey();
52 }
本文链接