在 ASP.NET MVC 5 中使用 Unity 框架





5.00/5 (8投票s)
在本文中,我们将学习如何在 ASP.NET MVC 5 应用程序中使用 Unity 框架来注册和解析依赖对象。
[注意:需要启用并还原 NuGet 包才能运行代码。]
引言
在本文中,我们将学习如何在 ASP.NET MVC 5 应用程序中使用 Unity 框架来注册和解析依赖对象。首先,我们将简要介绍 Unity 框架,然后创建一个演示应用程序以了解其在 ASP.NET MVC 5 中的用法。
先决条件:最好具备 MVC 和 Unity 框架的基础知识。
什么是 Unity 框架
Unity 是一个 DI 框架。Unity 框架的目的是将依赖项注入到依赖对象中。将依赖项注入依赖对象称为依赖注入(DI)。有关更多信息,请参阅 使用 Unity 进行依赖注入的开发人员指南
演示应用程序概述
我们将使用 ASP.NET MVC 5 创建一个演示应用程序,并了解如何使用 Unity 来注入依赖项。我们知道,每个大型应用程序都有多个模块,并且可能会使用服务。有时,一个服务为了实现其目标会使用其他组件。如果需要,服务可能相互依赖。我们将尝试复制类似的场景来理解 Unity 的强大之处。我们将创建一个简单的演示 Web 应用程序。该应用程序将包含两个模块,并将使用三种服务。
假设我们要为银行开发一个应用程序,该应用程序将有两个模块:账户信息和资金转账。在账户信息模块下,用户可以看到他们的账户详情。在资金转账模块下,用户可以将资金从一个账户转到另一个账户。
为实现上述功能要求,让我们使用 ASP.NET MVC 5 创建一个名为 RichBankDemoApp 的应用程序。在同一个解决方案中,我们将添加一个名为 RichBank.Services 的类库项目。RichBank.Services 将为 RichBankDemoApp 提供所需的服务。RichBank.Services 并非实际服务,而是真实服务的表示。RichBankDemoApp 应用程序将使用 CustomerService、AccountService 和 FundTransferService。因此,让我们在 RichBank.Services 项目中实现这三个服务。这里我们不针对任何数据库。出于演示目的,这三个服务将提供硬编码的数据。RichBank.Services 项目结构如下所示。代码易于理解,因此在此不作描述。
如上所述,RichBankDemoApp 应用程序将有两个模块,称为 AccountInfo 和 FundTransfer。为了区分这两个模块,使用了区域(Areas)。如果您不熟悉 ASP.NET MVC 中的区域,请参阅 此处。
现在,通过“管理 NuGet 程序包”,可以下载与 ASP.NET MVC 5 兼容的 Unity 4.0.1 版本。要下载 Unity 4.0.1,请在解决方案资源管理器中右键单击“引用”文件夹。单击“管理 NuGet 程序包”选项。“管理 NuGet 程序包”窗口将打开。转到“联机”,然后搜索 Unity。Unity 将可用,然后单击“安装”按钮,然后单击“关闭”按钮。“管理 NuGet 程序包”将自动下载并添加 Microsoft.Practices.Unity 和 Microsoft.Practices.Unity.Configuration 这两个库的引用。
UnityConfig.cs 文件将被添加到 App_Start 文件夹中。UnityConfig 是一个静态类,其中有一个名为 RegisterComponents 的静态方法。在此方法中,我们需要注册所有必需的依赖项。
注册依赖项:从 App_Start 中打开 UnityConfig.cs 文件,在 RegisterComponents 方法内部注册所有依赖项。以下代码显示了如何注册依赖项。
public static void RegisterComponents() { var container = new UnityContainer(); container.RegisterType<icustomerservice, customerservice="">(); container.RegisterType<iaccountservice, accountservice="">(); container.RegisterType<ifundtransferservice, fundtransferservice="">(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); } </ifundtransferservice,></iaccountservice,></icustomerservice,>
在上面的代码中,首先创建 UnityContainer 来注册依赖项。然后,所有依赖项都注册到容器中。在此注册过程中,将在接口和实现该接口的类之间进行映射。最后,使用 SetResolver 方法为应用程序设置 Unity 解析器。这里我们创建一个新的 UnityDependencyResolver,使用容器并将其传递给 SetResolver。
注意:RegisterType 方法有各种重载可用于将类型注册到容器中。在适当的时候,容器将构建已注册类型的实例。有关 RegisterType 的更多信息,请参阅 此处。
账户信息模块:账户信息模块将包含与账户相关的信息。为了获取账户详细信息,AccountInformationController 控制器需要与 AccountService 进行交互。在 AccountInformationController 中,我们不会使用 new 关键字创建 AccountService 的实例,而是将 IAccountService 传递给 AccountInformationController 的构造函数。我们已经将此服务注册到了 UnityContainer。因此,每当构造 AccountInformationController 时,unity 都会创建 AccountService 的实例,并且该实例将在 AccountInformationController 中可用。以下代码显示了 AccountInformationController 的实现。
public class AccountInformationController : Controller { private IAccountService accountService; public AccountInformationController(IAccountService accountService) { this.accountService = accountService; } public ActionResult Index() { //For demo purpose hardcoded CustomerId is passed List<account> allTrainings = accountService.GetAllAccountInfo(111); return View(allTrainings); } public ActionResult GetAccountDetail(string accountNumber) { Account accountdetail = accountService.GetAccountDetail(Convert.ToInt32(accountNumber)); return Json(accountdetail); } } </account>
AccountInformation 视图使用 HTML 和 jQuery 代码创建。完整的代码可在下载的示例中找到。下图显示了视图的布局。
资金转账模块:此模块提供了进行资金转账的选项。用户需要选择特定类型。将提供表单来执行资金转账。单击“转账金额”按钮后,填写的金额将转到选定的账户号码。完成转账过程后,将在此表单上显示“付款账户”的当前余额。为了执行上述任务,FundTransferController 将使用 FundTransferService 和 AccountService。以下代码显示了 FundTransferController 的实现。
public class FundTransferController : Controller { private IFundTransferService fundTransferService; private IAccountService accountService; public FundTransferController(IFundTransferService fundTransferService, IAccountService accountService) { this.fundTransferService = fundTransferService; this.accountService = accountService; } public ActionResult Index() { var fundTransferTyoesList = fundTransferService.GetFundTransferTypes(); return View(fundTransferTyoesList); } public ActionResult PerformTransaction() { return View(); } ... ... }
进行资金转账的布局将如下所示。
结论
在本文中,我们回顾了如何在 ASP.NET MVC 5 中使用 Unity。我们看到了 Unity 在向类注入依赖项方面有多大帮助。感谢阅读。欢迎提出您的评论和改进建议。