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

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2016年12月28日

CPOL

5分钟阅读

viewsIcon

49801

downloadIcon

1307

在本文中,我们将学习如何在 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 项目结构如下所示。代码易于理解,因此在此不作描述。

RichBank Services project

如上所述,RichBankDemoApp 应用程序将有两个模块,称为 AccountInfo 和 FundTransfer。为了区分这两个模块,使用了区域(Areas)。如果您不熟悉 ASP.NET MVC 中的区域,请参阅 此处

Areas

现在,通过“管理 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 这两个库的引用。

Manage NuGet Packages

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 代码创建。完整的代码可在下载的示例中找到。下图显示了视图的布局。

AccountInfo View

资金转账模块:此模块提供了进行资金转账的选项。用户需要选择特定类型。将提供表单来执行资金转账。单击“转账金额”按钮后,填写的金额将转到选定的账户号码。完成转账过程后,将在此表单上显示“付款账户”的当前余额。为了执行上述任务,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();
        }
        ...
        ...
  }

进行资金转账的布局将如下所示。

AccountInfo View

结论

在本文中,我们回顾了如何在 ASP.NET MVC 5 中使用 Unity。我们看到了 Unity 在向类注入依赖项方面有多大帮助。感谢阅读。欢迎提出您的评论和改进建议。

参考文献

  1. MSDN - 使用 Unity 进行依赖注入
  2. Stackoverflow 关于 Microsoft Unity 的讨论
© . All rights reserved.