65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 3 基础:第三部分(依赖注入)

2012年3月23日

CPOL

2分钟阅读

viewsIcon

52235

downloadIcon

1175

解释了使用依赖注入 (DI) 模式创建 MVC3 应用程序的基本信息和步骤。

概述

本文解释了 MVC 3 应用程序中的依赖注入 (DI)。

引言

本文解释了 MVC3 基础 第一部分第二部分 中的代码,因此请在开始 MVC 3 依赖注入(第三部分)之前查看这些文章。

依赖注入 (DI) 设计模式

依赖注入 (DI) 设计模式基于在对象干预之外分离组件行为和依赖关系解析。

该模式是控制反转的一种特定实现,其中消费者对象在其构造函数属性或参数中接收其依赖项。

使用依赖注入模式和控制反转的优点如下:

  • 降低类耦合
  • 提高代码重用
  • 提高代码可维护性
  • 提高应用程序测试性

在 MVC3Demo 项目中实现 DI

创建一个 UnityControllerFactory 类

为 Unity 创建一个 UnityControllerFactory(自定义类)。该类实现了 IControllerFactory 接口,扩展了 CreateControllerReleaseController 方法以与 Unity 协同工作。

CreateController 方法创建项目中可用的控制器实例。

请下载 Unity Application Block 2.0 并安装它。然后在 MVC3Demo 项目中引用 Microsoft.Practices.Unity

步骤 1

添加一个名为 Factories 的新文件夹,并添加一个类 UnityControllerFactory.cs

namespace MVC3Demo.Factories
{
    public class UnityControllerFactory : IControllerFactory
    {
        private IUnityContainer _container;
        private IControllerFactory _factory;

        public UnityControllerFactory(IUnityContainer container)
            : this(container, new DefaultControllerFactory()) { }


        public UnityControllerFactory(IUnityContainer container, IControllerFactory factory)
        {
            _container = container;
            _factory = factory;
        }

        public IController CreateController(System.Web.Routing.RequestContext requestContext, 
                                            string controllerName)
        {
            try
            {
                return _container.Resolve<IController>(controllerName);
            }
            catch (Exception)
            {

                return _factory.CreateController(requestContext, controllerName);
            }
        }

        public System.Web.SessionState.SessionStateBehavior 
               GetControllerSessionBehavior(
               System.Web.Routing.RequestContext requestContext, string controllerName)
        {
            return System.Web.SessionState.SessionStateBehavior.Default;
        }

        public void ReleaseController(IController controller)
        {
            _container.Teardown(controller);
        }
    }
}

为 ProductModel 创建接口

第二步

右键单击 ProductModel 类,然后单击 重构->提取接口 菜单。

然后单击“确定”。

重构 ProductController 类

ProductController 类的构造函数中引用 IProductModel 接口,而不是 ProductModel 具体类。

IProductModel model = null;
IList<ProductModel> AllProducts = null;

public ProductController(IProductModel _model)
{
    model = _model;
    AllProducts = model.GetAllProducts();
}

无无参数构造函数错误

构建并运行 MVC3Demo 应用程序,它会显示 此对象未定义无参数构造函数ProductController 构造函数有一个参数 IProductModel

配置 UnityContainer

步骤 3

使用 RegisterType 配置接口及其具体类,并创建自定义控制器工厂 UnityControllerFactory 的实例,并将其传递给 ControllerBuilder

请参阅下面的代码。

private void RegisterType()
{
    UnityContainer container = new UnityContainer();
    container.RegisterType<IProductModel, ProductModel>();
    container.RegisterType<IController, ProductController>("Product");

    UnityControllerFactory factory = new UnityControllerFactory(container);

    ControllerBuilder.Current.SetControllerFactory(factory);

}

Global.asax.cs 中创建此方法,并在 Application_Start() 事件的末尾调用 RegisterType 方法。

请参阅附带的代码压缩包以获取详细的应用程序代码。

结论

我希望本文能帮助您理解 MVC 3 应用程序中依赖注入 (DI) 的一些基础知识。

参考文献

  1. http://msdn.microsoft.com/en-us/gg618491
  2. http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9093
  3. http://msdn.microsoft.com/en-us/library/ff663144.aspx
© . All rights reserved.