C#当中Attribute(中文注解属性)已经知道这个概念已经很久很久了,不过悲剧的是在实际项目当中重来没有用它来做过什么东西,以致对它的理解总是很浅薄,更谈不上如何在实际项目中运用它。最近在学习<MVC3框架设计>这本书中,看到Filter这一章,突然悟到点感受,先分享如下:

感想一:Attribute大部分用在框架设计与组件设计中

我们平时开发的大部分是三层架构的Web项目,开发人员面向的客户就是只有自己。而框架设计或组件设计中,系统的目标是开发人员,所以整个系统的设计一部分框架设计者实现,另一部分由框架使用者(开发人员)来完成。就像asp.Net MVC框架一样,微软设计了Web项目的核心生命流程,如下图

而对于我们.Net的开发人员,只需要在这个HTTP框架流程管道中挂接自己的代码,就像乘上这班车一样就能顺利达到目的地。如在Controller中定义自己的Action,读取数据库,然后返回给ViewEngine。

话又回到我们的主题:这些与Attribute有什么关系呢?

当然有关系,框架的设计者为了给开发人员更多的接口,更多选择,所以定义很多Attribute供开发人员选择使用,来指定不同的框架功能。

举例:当开发人员需要利用Filter特性来验证用户登录情况,如下图

public class CheckinLoginAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session["user"] == null)
{
filterContext.HttpContext.Response.Redirect("/User/Login");
}
}
} public class HomeController : Controller
{
//
// GET: /Home/ [CheckinLogin]
public ActionResult Index()
{
return View();
} }

当框架实际执行时,会通过反射发现存在[CheckInLogin]这个特性,然后动态决定行为,去执行用户定义的代码。这样做的好处时,通过Attribute机制将业务代码与权限代码很好的分离开发,代码更简洁,可理解性更强。如果没有这个特性的话,判断用户登录的代码就必须放在Action中完成,这样造成了不相关的代码耦合的在一起,使代码更难维护和阅读。

感想二:Web项目中也可以使用Attribute

有的童鞋要说了,我们这些码农平时忙的连学习总结的时间也没有,怎么可能有时间做框架设计呢?那岂不是永远也不可能正在用到Attribute?答案是否定,只要你善于观察、善于用心,项目中同样可以用到这个特性。对于如何应用,下次再讨.....

总结:

尽管顿悟出这么一点感受,但是毕竟还没有真正在项目中应用过,对它的理解与掌握还是任重而道远。我一直认为没有在实践中真实解决问题的经验,对知识的理解永远是停留在表面,不管你理论上理解的有多透彻。

C#注解属性的感想一:的更多相关文章

  1. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  2. 【java自定义注解1】java自定义注解-属性

    关于自定义注解,以前项目种应用的不多,最近看新项目过程中发现了挺多自定义注解相关内容,使用起来比较巧妙,于是 总结了两种方式,记录如下: 第一种:结合反射进行属性注入,代码如下: 1.定义一个注解: ...

  3. Spring 注解编程之注解属性别名与覆盖

    前两篇文章咱聊了深入了解了 Spring 注解编程一些原理,这篇文章我们关注注解属性方法,聊聊 Spring 为注解的带来的功能,属性别名与覆盖. 注解属性方法 在进入了解 Spring 注解属性功能 ...

  4. fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配

    一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...

  5. JDK动态代理+反射实现动态修改注解属性值

    这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~ 一.准备自定义注解 注:如何实现自定义注解,请移步百度. 二.实现 1.实现方式1:通过反射+动态代理动态 ...

  6. FeignClient注解属性configuration不生效问题排查思路

    FeignClient注解属性configuration不生效问题排查思路 问题背景 我们知道,"如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ ...

  7. 7.1数据注解属性--Key【Code-First系列】

    Key特性可以被用到类的属性中,Code-First默认约定,创建一个主键,是以属性的名字“Id”,或者是类名+Id来的. Key特性重写了这个默认的约定,你可以应用Key特性到一个类的属性上面,不管 ...

  8. hibernate的注解属性mappedBy详解

    mappedBy: 1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性: 2>mappedBy标签一定是定义在被拥 ...

  9. 02-hibernate注解-属性级别注解

    添加方式: 一是写在属性字段上面. 二是写在属性的get访问器上面. 主要有: @Id, @SequenceGenerator @GeneratedValue @Colum @Embedded @Em ...

随机推荐

  1. Mac下Boost环境搭建

    Boost,一个功能强大.跨平台.开源而且免费的C++程序库,可以在其官网了解更多:http://www.boost.org,C++标准经过不断的升级完善,现在已经功能越来越吸引人了,Boost开发过 ...

  2. HBASE列族不能太多的真相 (一个table有几个列族就有几个 Store)

    HRegionServer内部管理了一系列HRegion对象,每个HRegion对 应了table中的一个region,HRegion中由多 个HStore组成.每个HStore对应了Table中的一 ...

  3. 基于NPOI的报表引擎——ExcelReport

    前言 其实现在说ExcelReport是报表引擎还为时尚早,但该组件我既然要决心维护下去,这便算是初衷吧! 1.现在,ExcelReport能为你做什么呢? 如果,你有导出数据到Excel的需求,Ex ...

  4. 【Cocos2d-x for WP8 学习整理】(1)创建一个新项目

    喜大普奔                         10.1假期之前看到了一个很振奋的消息,就是随着Cocos2d-x 2.2的发布,WP8/WIN8有史以来第一次的合并到主版本了. 之前 V2 ...

  5. CozyRSS开发记录5-订阅列表栏里的项

    CozyRSS开发记录5-订阅列表栏里的项 1.订阅列表栏里的项的原型图 这里列表项依然参考傲游的RSS阅读器,以后可能会微调. 2.使用ControlTemplate来定制ListBoxItem 给 ...

  6. MIT 6.828 JOS学习笔记4. Lab 1 Part 2.1: The Boot Loader

    Part 2: The Boot Loader 对于PC来说,软盘,硬盘都可以被划分为一个个大小为512字节的区域,叫做扇区.一个扇区是一次磁盘操作的最小粒度.每一次读取或者写入操作都必须是一个或多个 ...

  7. Js-知识小总结

    1.给标签价 class属性的时候,记住是 ClassName, 例如:var oImg = document.getElementById('img1'); 要给这个对象价class属性 oimg. ...

  8. 【转载】科研ppt制作的体会

    转载自实验室陈家雷学长发在bbs 上的帖子,讲解了自己制作ppt的心得体会.学习下. 附件中是我昨天晚上我的组会ppt的pdf版本,另外我对ppt的制作有点自己的理解,基本上都是去年暑假在Harvar ...

  9. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  10. Masonry小结

    一,容易混淆的问题 1.make.left.equal(xxx)的参数若为某个控件,则默认为以该控件的 left 为基准对照. //these two constraints are exactly ...