在本文中,将学习如何在ASP.NET MVC 5应用程序中使用Unity框架来注册和解析依赖对象。首先,将简要了解Unity框架,然后创建一个演示应用程序以理解其与ASP.NET MVC 5的用法。
最好具备MVC和Unity框架的基本知识。
Unity是一个依赖注入(DI)框架。Unity框架的目的是将依赖注入到依赖对象中。将依赖注入到依赖对象中的过程称为依赖注入(DI)。有关更多信息,请查看。
将使用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中的Areas,请查看。
使用Manage NuGet Packages,可以下载与ASP.NET MVC 5兼容的Unity 4.0.1版本。要下载Unity 4.0.1,请在解决方案资源管理器中右键单击References文件夹。单击“Manage NuGet Packages”选项。将打开Manage NuGet Packages窗口。转到在线,然后搜索Unity。Unity将可用,然后单击Install按钮,然后单击Close按钮。Manage NuGet Packages将自动下载并添加两个库的引用,分别是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(new ContainerControlledLifetimeManager());
container.RegisterType(new ContainerControlledLifetimeManager());
container.RegisterType(new ContainerControlledLifetimeManager());
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
在上面的代码中,首先创建UnityContainer以注册依赖项。然后,将所有依赖项注册到容器中。在这里注册时,映射是在接口和实现该接口的类之间进行的。最后,使用SetResolver方法为应用程序设置Unity解析器。在这里,使用容器创建了一个新的UnityDependencyResolver并将其传递给SetResolver。
Account Info模块将包含与账户相关的信息。要获取账户详细信息,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()
{
// 出于演示目的,硬编码传递了CustomerId
List allAccounts = accountService.GetAllAccountInfo(111);
return View(allAccounts);
}
public ActionResult GetAccountDetail(string accountNumber)
{
Account accountDetail = accountService.GetAccountDetail(Convert.ToInt32(accountNumber));
return Json(accountDetail);
}
}
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 fundTransferTypesList = fundTransferService.GetFundTransferTypes();
return View(fundTransferTypesList);
}
public ActionResult PerformTransaction()
{
return View();
}
...
...
}