C#注解属性的感想一:

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?答案是否定,只要你善于观察、善于用心,项目中同样可以用到这个特性。对于如何应用,下次再讨.....

总结:

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

时间: 2024-10-12 11:58:45

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

使用注解属性绑定

大家应该知道在Spring中有一个注解@Value,他可以帮助我们来讲Spring加载的配置文件(*.perperties)文件中的信息自动的注入到我们的非静态属性中的. 一般情况下我们会这样使用: 1. 首先在Spring的配置文件中加载属性文件: ? 1 <context:property-placeholder location="classpath:component.properties"  ignore-unresolvable="true"/&g

使用无注解属性的过滤

mvc中使用过滤器常规的办法是使用注解属性.然而还有另外一种办法,Controller类也实现了IAuthorizationFilter.IActionFilter.IResultFilter和IExceptionFilter接口.所以可以在 Controller类中直接重写相应的方法就可以使该Controller下的所有Action就被应用于所重写的过滤. public class HomeController : Controller { private Stopwatch timer; [

spring HibernateDaoSupport 注解属性注入的方法

/*使用注解属性注入无法调用HibernateDaoSupport中的setSessionFactory方法,需要手动创建,并且setSessionFactory不能被重写 * 需要新建方法,在新方法中调用父类的setSessionFactory方法,显式的指向属性名称*/ @Resource(name="sessionFactory") private void setSF(SessionFactory sessionFactory) { setSessionFactory(sess

用jackson的@JsonProperty注解属性名,会多出一个字段

遇见了这个情况,我的字段定义是xVal,yVal,用的lombok的@Data注解.然后查询到了下面这偏文章,https://bbs.csdn.net/topics/392305619,里面的回答是图片,我只是翻译一下图片而已. 以下是引用的原文:jackson2对pojo类型序列化的处理. Jackson2在初始化序列器时,对pojo类型对象会收集其属性信息,属性包括成员变量及方法,然后属性名称和处理过后的方法名称做为key保存到一个LinkedHashMap中.收集过程中会调用com.fas

fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线识别

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

Hibernate 一对一、一对多、多对多注解属性的总结

mappedBy: 所填内容必为本类在另一方的字段名. 表示:本类放弃控制关联关系,所有对关联关系的控制,如:建立.解除与另一方的关系,都由对方控制,本类不管.举个例子: Teacher和Student之间是多对多关联关系,在Student端的teachers字段的@ManyToMany注解里面,配置属性mappedBy = "students".表示:学生没有资格控制与老师的关联关系(如:建立关系.删除关系),只有老师才有资格控制关联关系.学生不能说:"我们两做朋友吧&qu

hibernate的注解属性mappedBy详解

mappedBy: 1>只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性: 2>mappedBy标签一定是定义在被拥有方的,他指向拥有方: 3>mappedBy的含义,应该理解为,拥有方能够自动维护跟被拥有方的关系,当然,如果从被拥有方,通过手工强行来维护拥有方的关系也是可以做到的: 4>mappedBy跟joinColumn/JoinTable总是处于互斥的一方,可以理解为正是由于拥有方的关联被拥有方的字段存

hibernate的注解属性mappedBy详解【实际项目】

[应用情节: 技术问答] 一个类是问题类 一个类是回答类 一个类是针对回答的讨论类 关系是一个问题对应多个答案   一个答案对应多个讨论 [三个类的注解关系] 问题类的 答案类的 讨论类的

数据注解属性--TimeStamp特性【Code-First 系列】

TimeStamp特性可以应用到领域类中,只有一个字节数组的属性上面,这个特性,给列设定的是tiemStamp类型.在并发的检查中,Code-First会自动使用这个TimeStamp类型的字段. 下面让我们来看看代码吧: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.S