开始使用Unity.Mvc3
本文一步一步演示如何在MVC3项目中使用Unity.Mvc3实现依赖注入。
先创建一个基本的MVC3项目。
Figure 1: The Visual Studio 2010 New Project Dialog
Figure 2: The Visual Studio 2010 New ASP.NET MVC3 Internet Application Template
通过NuGet将Unity.Mvc3加入到项目。.右击references选择Manage NuGet packages.。在弹出对话框 输入Unity.Mvc3 搜索。. 在搜索结果中选择Unity.Mvc3 安装。

Figure 3: Manage NuGet Packages Context Menu Item

Figure 4: Manage NuGet Packages Dialog
NuGet将安装Unity 和Unity.Mvc3并添加到引用,同时在项目中添加一些文件。 Bootstrapper.cs包含初始化Unity容器和DependencyResolver的代码。
using
System.Web.Mvc; using
Microsoft.Practices.Unity; using
Unity.Mvc3; namespaceMvcApplication1
{ publicstatic
classBootstrapper
{publicstatic
voidInitialise()
{var container = BuildUnityContainer();DependencyResolver.SetResolver(newUnityDependencyResolver(container));
}privatestatic
IUnityContainer BuildUnityContainer(){var container =new
UnityContainer();// register all your components with the container here// e.g. container.RegisterType<ITestService, TestService>();
return
container; }}} |
在Global.asax 的Application_Start 方法中添加对Bootstrapper初始化方法的调用。
protectedvoid
Application_Start(){ AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);Bootstrapper.Initialise();} |
:-)
添加依赖
这里以一个简单的消息service为例,演示如何通过unity.Mvc3实现依赖注入。添加IMessageService接口和实现了此接口的MessageService。
namespaceMvcApplication1
{ publicinterface
IMessageService{stringGetMessage();
}publicclass
MessageService : IMessageService{publicstring
GetMessage(){return"Hello from the MessageService";}}} |
修改HomeController,在HomeController中使用ImessageService。
using
System.Web.Mvc; namespaceMvcApplication1.Controllers
{ publicclass
HomeController : Controller{privatereadonly
IMessageService _messageService;publicHomeController(IMessageService messageService)
{_messageService = messageService;}publicActionResult Index()
{ViewBag.Message = _messageService.GetMessage();returnView();
}publicActionResult About()
{returnView();
}}} |
最后,告诉unity我们的服务类 MessageService。在Bootstrapper类的BuildUnityContainer 方法中使用RegisterType<TFrom, TTo>注册我们的接口和实现,完成接口和实现的Map。.
privatestatic
IUnityContainer BuildUnityContainer(){ var container =new
UnityContainer();container.RegisterType<IMessageService, MessageService>();
return
container; } |
运行效果如下图所示。 MVC framework 告知DependencyResolver返回一个 HomeController。Resolver通过Unity 获知 HomeController 需要一个明确的IMessageService接口实现。由于在初始化时注册了IMessageService接口和实现的Map, Unity 将实例化一个MessageService对象,注入到控制器中,返回给MVC framework。由此完成了依赖注入。

Figure 5: MVC View Displaying The Message Created By The The MessageService
添加依赖的依赖
增加一点复杂度。假设MessageService本事也有依赖,创建一个IMessageGenerator接口和实现.
namespaceMvcApplication1
{ publicinterface
IMessageGenerator{stringGetMessage();
}publicclass
MessageGenerator : IMessageGenerator{publicstring
GetMessage(){return"消息来自MessageGenerator";}}} |
修改MessageService:.
public
class MessageService : IMessageService { privatereadonly
IMessageGenerator _messageGenerator;publicMessageService(IMessageGenerator messageGenerator)
{_messageGenerator = messageGenerator;}publicstring
GetMessage(){returnstring.Concat("通过MessageService,",_messageGenerator.GetMessage());}} |
同样,将新的组件注册到Unity:
container
.RegisterType<IMessageService, MessageService>().RegisterType<IMessageGenerator, MessageGenerator>(); |
运行结果如图6所示。
Figure 6: MVC View Displaying The Message Created By The The MessageService And MessageGenerator
IDisposable依赖
最后,我们演示实现 IDisposable的依赖。. 无论使用NHibernate, Entity Framework 或者 LINQ to SQL, 必须在request之后释放context/session 。这里演示如何通过Unity.Mvc3释放对象。
using
System; using
System.Diagnostics; namespaceMvcApplication1
{ publicinterface
IMessageGenerator{stringGetMessage();
}publicclass
MessageGenerator : IMessageGenerator, IDisposable{publicstring
GetMessage(){return"Hello from the MessageGenerator";}publicvoid
Dispose() {Debug.WriteLine("Message Generator is being disposed");}}} |
在注册时使用HierarchicalLifetimeManager告知dependency resolver。
container
.RegisterType<IMessageService, MessageService>().RegisterType<IMessageGenerator, MessageGenerator>(newHierarchicalLifetimeManager());
|
演示结果如下:

Figure 7: Output Window Showing Message When MessageGenerator Is Disposed
结论
Unity.Mvc 安装时,如果之前没有安装Unity,将自动安装。.Bootstrapper文件自动加入到项目中,以减少开发者使用Unity.Mvc3的步骤。
译注:安装也可通过Package Manager Console使用Install-Package Unity.Mvc3命令安装。

本文详细介绍了如何在MVC3项目中使用Unity.Mvc3进行依赖注入,包括创建项目、安装Unity.Mvc3、配置依赖、处理接口与实现映射以及管理IDisposable依赖等关键步骤。
158

被折叠的 条评论
为什么被折叠?



