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






4.83/5 (4投票s)
解释了使用依赖注入 (DI) 模式创建 MVC3 应用程序的基本信息和步骤。
概述
本文解释了 MVC 3 应用程序中的依赖注入 (DI)。
引言
本文解释了 MVC3 基础 第一部分 和 第二部分 中的代码,因此请在开始 MVC 3 依赖注入(第三部分)之前查看这些文章。
依赖注入 (DI) 设计模式
依赖注入 (DI) 设计模式基于在对象干预之外分离组件行为和依赖关系解析。
该模式是控制反转的一种特定实现,其中消费者对象在其构造函数属性或参数中接收其依赖项。
使用依赖注入模式和控制反转的优点如下:
- 降低类耦合
- 提高代码重用
- 提高代码可维护性
- 提高应用程序测试性
在 MVC3Demo 项目中实现 DI
创建一个 UnityControllerFactory 类
为 Unity 创建一个 UnityControllerFactory
(自定义类)。该类实现了 IControllerFactory
接口,扩展了 CreateController
和 ReleaseController
方法以与 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) 的一些基础知识。