Pro ASP.NET MVC 3 Framework学习笔记之五

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 03:30 点击:

 

 

一,创建松耦合的组件

1."分解关注点"是MVC模式里面一个非常重要的特性。我们想要在应用程序里面创建的组件尽可能的独立,这样我们就能管理比较少的依赖关系。理想情况下,每个组件都是孤立的,不知道其他组件的存在,处理应用程序的其他领域仅仅通过抽象接口,这就是所谓的松耦合,它让我们的应用程序更加容易测试和修改。通过一个简单的例子可以帮助我们理解,假如我们想写一个发邮件的组件,暂且就把这个组件命名为MyEmailSender,接着我们实现一个接口,这个接口定义了所有需要发送邮件的功能,也暂且将这个接口命名为IEmailSender。任何其他的应用程序的组件需要引用IEmailSender里面的方法就行了。比如有一个重置密码的组件PasswordResetHelper需要在用户重置密码后发生邮件,下图展示这它们之间的关系:

\

 

通过引入IEmailSender,我们就能够确保在PasswordResetHelper跟MyEmailSender之间没有直接的依赖关系。比如,我们可以用其他的实现了发送邮件的Provider来替换当前的MyEmailSender而不会对PasswordResetHelper造成影响,从这里也能够体会到松耦合的好处吧。

 

当然并不是所有的组件之间存在的关系都需要用接口来解耦和。这取决于我们的应用程序的复杂程度,需要什么样的测试,长期维护的可能性。我们不用去对一个简单的ASP.NET MVC程序执行解耦。

 

2.使用依赖注入

接口能够帮助我们解耦组件,但是这样仍然面临一个问题,那就是C#并没有提供一种嵌入的方式来比较容易的创建实现接口的对象,因为我们只能创建一个具体实现了接口的组件的实例,比如这里的的MyEmailSender的实例。像下面的这种方式:

 

public class PasswordResetHelper

{

        public void ResetPassword()

        {

               IEmailSender mySender = new MyEmailSender();

               //一些关于邮件的详细

               mySender.SendEmail();

        }

}

 

我们仅仅做了松耦合的一部分工作,PasswordResetHelper类通过IEmailSender来配置和发送邮件,通过接口的实现来创建对象,这里需要创建一个MyEmailSender的实例。这样看来,我们可能让事情更糟,因为现在的PasswordResetHelper同时依赖IEmailSender和MyEmailSender,正如下图所显示的那样:

\

 

其实我现在需要一种方式来获取对象(这里就是指上面代码里的mySender),这个对象是实现了我们给定的接口但不是直接去创建实现接口(这里指MyEmailSender)对象本身。对于这个问题的解决方案,我们称为依赖注入(dependency injection(DI)),也可以被认为是控制反转(inversion of control(IoC))。

 

3.DI(dependency injection):是一种完成松耦合的设计模式,这是一个非常重要的概念,它是高效MVC开发的中心。

DI分为两个部分:一是从我们的组件里面移除任何的对具体类的依赖性。在我们的这个例子里面,我们这样来做,将对必要接口的实现移动到类的构造器里面,如下所示:

 

public class PasswordResetHelper

{

      private IEmailSender emailSender;

      public PasswordResetHelper(IEmailSender emailSenderParam)

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • 浅析.NET下XML数据访问新机制
    • asp.net 面试+笔试题目第1/2页
    • C# 邮件地址是否合法的验证
    • asp.net 设置GridView的选中行的实现代码
    • C#高级编程:数据库连接[1]
    • 经典C++程序1
    • IIS 自动回收导致后台定时器失效的问题解决
    • ASP.NET GridView列表代码示例
    • Asp.net MVC源码分析--Action Filter的链式调用
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1