你的位置:首页 > ASP.net教程

[ASP.net教程]Unity、Exception Handling引入MVP


什么是MVP?在“MVP初探”里就有讲过了,就是一种UI的架构模式。

简单的描述一下Unity和Exception Handling Application Block:

Unity是一个轻量级的可扩展的依赖注入(DI)容器,支持构造函数,属性和方法调用注入。构建一个成功应用程序的关键是实现非常松散的耦合设计。松散耦合的应用程序更灵活,更易于维护 。

微软Enterprise Library ELAB(Exception Handling Application Block)提供了一种基于策略(Policy)的异常处理方式,在不同的环境中,比如多层架构中不同的层次中,我们可以定义不同的异常处理策略。

为使M/V/P之间更好的解耦,我们通过引入Enterprise Library的Exception Handling Application Block来实现异常处理,借助Policy Injection Application Block来实现AOP,即然从2.0开始Unity就有几个内置的Handler(Authorization/Exception Handling/Logging/Performance Counter/Validation),自然也就引入了Unity。

这样,我们就可以做到以AOP的方式处理异常(不仅仅只有异常,还可以是其它的业务无关性处理)。我们通过Unity的使得P对M的依赖得以解除,同时也大大增强了可扩展性和可配置性。将系统的耦合度也除到最低。

实例演练:

延用《MVP之V和P交互》的例子:

  • 修改配置文件添加配置节

 

<configSections>  ...  <section name="unity"      type=" Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=2.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </configSections>

 

  • 添加Unity节元素

 

 

 <unity ="http://schemas.microsoft.com/practices/2010/unity">  </unity>

 

这个元素节的名称也就添加配置节时的名称,两者要相同;

  • 添加程序集和命名空间
<assembly name="Handwe.Demo.UnityInMVP" />  <namespace name="Handwe.Demo.UnityInMVP" />

使得可以在相应的程序集和命名空间里查到相对应的类;在这里也可以添加别名;

  • 添加容器的扩展节
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration" />  

用于在Unity容器中扩展拦截;

  • 添加默认(未命名)容器container
<container></container>

接着,在这个container里注册类型或接口,这里我们注册的是接口,并用于拦载;

  • 注册接口/类型
<register type="ICalculatorView" mapTo="CalculatorView"/>   <register type="ICalculate" mapTo="Calculate">    <interceptor type="TransparentProxyInterceptor"/>    <interceptionBehavior type="PolicyInjectionBehavior"/>   </register>

注册了两个接口,一个是ICalculatorView并映射到CalculatorView;另外一个是ICalculate映射到Calculate;这里我们只对ICalculate使用了拦截,有三种拦截器,适用于接口或类型,它是接口类型,所以选择透明代理拦截器类型TransparentProxyInterceptor,并使用提供的策略拦载行为PolicyInjectionBehavior.

  • 添加拦截扩展元素
   <extension type="Interception" /><interception>    <policy name="policy-exceptionHandler">     <matchingRule name="auther-rule2" type="MemberNameMatchingRule">      <constructor>       <param name="namesToMatch">        <array type="string[]">         <value value="Divide" />         <value value="Check" />        </array>       </param>      </constructor>     </matchingRule>     <callHandler name="exceptionHandler-handler1" type="Handwe.Demo.UnityInMVP.ExceptionCallHandler, Handwe.Demo.UnityInMVP">      <constructor>       <param name="exceptionPolicyName" value="UIExceptionPolicy"/>       <param name="order" value="1"/>      </constructor>     </callHandler>    </policy>   </interception>

 

 

Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入。Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题。构建一个成功应用程序的关键是实现非常松散的耦合设计。松散耦合的应用程序更灵活,更易于维护。这样的程序也更容易在开发期间进行测试。你可以模拟对象,具有较强的具体依赖关系的垫片(轻量级模拟实现),如数据库连接,网络连接,ERP连接,和丰富的用户界面组件。例如,处理客户信息的对象可能依赖于其他对象访问的数据存储,验证信息,并检查该用户是否被授权执行更新。依赖注入技术,可确保客户类正确实例化和填充所有这些对象,尤其是在依赖可能是抽象的 。