您的位置:首页 > 移动开发 > Unity3D

MVC3使用Unity实现依赖注入接口与于实现类自动注册

2012-07-09 14:46 701 查看

MVC3使用Unity实现依赖注入接口与于实现类自动注册

 

关于依赖注入

   控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

   控制反转还有一个名字叫做依赖注入(Dependency Injection),简称DI。相对而言对于.Net开发者来说听到得更多的是依赖注入这个名词。实现依赖注入的框架有很多,如Spring.Net,Unity,Ninject等等,基本上萝卜白菜各有所爱,当然了更多的还是根本不尿依赖注入。

  Unity(Unity Application Block)是微软patterns & practices组用C#实现的轻量级,可扩展的依赖注入容器,支持构造函数注入、属性注入、方法调用注入,开发者使用Unity可以很轻松的建立松散耦合的应用程序。关于Unity的常规使用方法可以参考 【ASP.Net MVC3 】使用Unity 实现依赖注入 ,本文主要探讨下接口到实现类的自动映射注册实现方案。

Unity容器接口和实现类的自动注册

  众所周知我们使用依赖注入时要么使用配置文件建立接口和实现类的映射关系,要么使用代码直接注册依赖关系。这两种方法都有一个弊端那就是当你新添加了一个接口和接口的实现后必须去修改配置文件或者代码去注册新的映射关系,当你改了接口、类名后还得再次去修改映射关系。实际应用中更多的是使用配置文件来实现映射关系的注册,这对于Java来说就是天经地义的事,不过放到.Net来说完全不是那么回事,繁杂的配置文件,无尽的接口映射,重复的乏味的代码简直不可忍受,于是乎激发了实现全自动映射的念想。

原理:所谓的依赖注入无非就是根据配置文件或代码完成接口和实现类的映射关系,然后使用反射实现的接口实例化而已。

目的:使用Unity实现ASP.Net MVC3的依赖注入,实现松耦合设计,但不使用配置文件,将开发人员从繁琐的配置中解脱出来,将关注点放在业务领域设计实现上

思路:扫描应用程序域的的所有程序集,在Unity容器中完成实现了接口或继承了抽象类的Class完成接口到Class的映射关系注册

  首先建立一个WebApp Mvc3项目,建立LazyRabbit.Domain和LazyRabbit.Infrastructure.Dependency类库,使用NuGet添加对向WebApp和LazyRabbit.Infrastructure.Dependency添加Unity引用,NuGet使用请参考/article/4955696.html

Install-Package Unity


完成后输出类似如下结果:

DependencyContext

具体说明下DependencyContext类 

  1.获取bin目录下的所有DLL文件,过滤掉不需要实现依赖注入的DLL
  因为是自动扫描所有程序集,所以无法分辨哪些是我们自己的程序集,因此可以显示的排除不需要的程序集,减少不必要的加载,以提高程序性能,这里我们只保留程序集的名称,因为我们从当前应用程序域获取程序集,所以我们只需要获取要进行自动类型注册的程序集名称完成程序集过滤即可。  

UnityDependencyResolver
  现在我所需要的编码已经全部完成了,只差最后一步,在Application_Start中添加代码LazyRabbit.Infrastructure.Dependency.DependencyContext.RegisterDependency()完成依赖注入的初始化以及和MVC的关联



protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
LazyRabbit.Infrastructure.Dependency.DependencyContext.RegisterDependency();
}




RegisterDependency()方法代码



public static void RegisterDependency()
{
Init();
DependencyResolver.SetResolver(new UnityDependencyResolver(Current));
}




具体应用依赖注入

   至此全自动注册依赖关系已经搞定,我们在WebApp建立IApplication接口和实现类Application,在LazyRabbit.Domain中建立IUserService接口和实现类UserService (LazyRabbit.Domain纯粹是为了掩饰着玩建立的,呵呵),完成后我们在HomeController进行调用



public class HomeController : Controller
{
/// <summary>
/// 这个不指定Name
/// </summary>
[Dependency]
public IApplication Application { get; set; }

/// <summary>
/// 这个用Name指定实现类
/// </summary>
[Dependency("LazyRabbit.Domain.UserService")]
public IUserService UserService { get; set; }

//
// GET: /Home/

public ActionResult Index()
{
ViewBag.SiteInfo = Application.GetSiteInfo();
ViewBag.CurrentUser = UserService.GetCurrentUser();
return View();
}

}




微软Unity下载: http://www.microsoft.com/en-us/download/details.aspx?id=17866

Unity官网 http://unity.codeplex.com/

源码下载:UnityDemo.rar

  本例特点在于实现思路简单,代码通俗易懂,复用性强,可以把LazyRabbit.Infrastructure.Dependency类库直接拿到项目使用,只需在Application_Start中调用下依赖注入初始化方法即可。这种设计方案可以大幅降低我们使用依赖注入的开发的工作量,设计上有足够的灵活性,不需要对现有代码做任何修改,即可轻松实现依赖注入,完全不用操心接口的注册问题,只要定义了接口和实现类就能自动完成注册。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: