C#注解属性的感想一:

时间:2021-10-18 16:30:36

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

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

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

 C#注解属性的感想一:

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


 

总结:

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