Welcome

首页 / 软件开发 / .NET编程技术 / Enterprise Library Policy Injection Application Block之一

Enterprise Library Policy Injection Application Block之一2010-09-10 cnblogs artech在过去的半年里,定期或者不定期地写点东西已经成为了我的一种习惯。可是最近两个月来一直忙于工作的事情一直足够的时间留给自己,虽然给自己列了很长一串写作计划,可是心有余而力不足。这一段工作主要是帮助公司开发一套分布式的开发框架,对一些技术和设计方法有了一些新的认识。这两天的工作主要是如何把Enterprise Library V3.1的PIAB(Policy Injection Application Block)引入到我们自己的框架中,为次对PIAB进行了一些研究,借此机会与大家一起分享。

Part I:PIAB Overview

Part II:PIAB设计和实现原理

Part III:PIAB扩展-如何创建Custom CallHandler

一、Business Logic 和 Infrastructure Logic的分离

对于任何一个企业级应用的开发人员来说,他们编写的代码不仅仅是处理单纯的业务逻辑,同时还需要处理很多的非业务方面的逻辑,比如:Caching、Transaction Enlist、Authorization、Auditing、Exception Handling、Logging、Validation甚至是Performance Counter。我习惯把这些非业务逻辑成为Infrastructure Logic。由于这些Infrastructure Logic通常根据具体的需求注入的具体的业务逻辑的执行中,所以又被更多地成为Crosscutting Concern。

如果按照传统的OO的编程方式,我们通常将这些Business Concern和Crosscutting Concern糅合在一起,从而导致了某种意义的紧耦合。这种紧耦合在一个大型的企业级应用可能是会给应用的可扩展性带来致命的影响。所以必须以某种方式实现Business Concern和Crosscutting Concern的分离,这通常是AOP实现的目标。

举个简单的例子,我们现在有如下一个简单的订单处理操作,可能具体的业务逻辑很简单。但是此操作面临的非业务逻辑可能有很多。比如:· 在处理之前进行Authorization,确定当前的用户是否具有此操作的权限。

· Auditing,记录处理的用户、处理时间等等。

· Transaction Enlist,将所有Data Access操作纳入同一个Transaction,保证数据的一致性。

· 进行Exception Handling。

· 如果出现异常,记录日志。

上面的这些可以体现在线面的Code中:

public void ProcessOrder(Order order)
{
Authorize();
Audit();
using (TransactionScope scope = new TransactionScope())
{
try
{
OrderDataAccess();
}
catch (Exception ex)
{
HandleExceptoin(ex);
Log();
}
}
}

可以看到上面这么多行代码中,和业务相关的就一行而已。虽然对这些非业务逻辑的实现通常通过调用一个封装好的方法或者组件完成,你往往只需要Copy Paste就可以了,但是将如此众多的Infrastructure Logic和Business Logic按照这样的方式组合在一起有很多的隐患。

首先,将一些公共的Source code进行大规模的复制不能保证其同一性和正确性。我个人觉得,对于一个程序原来说,如果你频繁地使用到Ctrl + C和Ctrl + V,你应该想到你的代码需要重构。

其次,Infrastructure Logic和Business Logic这种耦合性导致对Infrastructure Logic的变动将获导致Source Code的改变。

此外,这样的编程方式增加了程序员的压力,可能对于一个相对Junior的程序员来说,可能根本不知道这个Infrastructure Logic的具体作用何在,而实际上对于最终的程序员来讲,这些应该是对他们透明的。

所以我们需要寻求某种方式将这些Infrastructure Logic注入到某个具体的操作中,而不需要将所有的逻辑实现在具体的方法定义中。比如:你可以通过配置文件进行配置,你也可以通过添加Attribute一声明的方式来实现。而这一切都可以通过Enterprise Library的PIAB来实现。