构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)2014-08-10Unity 2.x依赖注入by运行时注入[附源码]Unity 2.x依赖注入(控制反转)IOC,对于没有大项目经验的童鞋来说,这些都是陌生的名词,甚至有些同学还停留在拉控件的阶段。您可以访问http://unity.codeplex.com/releases得到最新版本的Unity现在。当然,如果您在您的visual studio 中安装了Nuget 包管理器,你可以直接在Nuget中获取到最新版本的Unity。貌似最新是3了,第5讲我们糟糕的代码演示了接口如何用这里http://unity.codeplex.com/documentation我们找到了帮助文档大家可以下载下来看看我们采用的是构造函数注入,运行时注入。这块的概念可以算算是本系统最模糊的,大家应该好好理解下,博客园一位大虾的【ASP.Net MVC3 】使用Unity 实现依赖注入 大家进去看看这里我不再详说了。贴出代码,告诉大家怎么做就好了。下载http://files.cnblogs.com/ymnets/Microsoft.Practices.Unity.rar在App.Admin创建Library放进去,以后我们要用到的类库都放到这里来,除非说明,引用的类库都是开源的。App.Core引用Microsoft.Practices.Unity.dll , System.Web.Mvc, System.Web,3个类库和4.BLL,App.IBLL,App.DAL,App.IDAL 4个类库添加以下2个类
using System;using System.Collections.Generic;using System.Linq;using System.Web;using App.BLL;using App.DAL;using App.IBLL;using App.IDAL;using Microsoft.Practices.Unity;namespace App.Core{public class DependencyRegisterType{//系统注入public static void Container_Sys(ref UnityContainer container){container.RegisterType<ISysSampleBLL, SysSampleBLL>();//样例container.RegisterType<ISysSampleRepository, SysSampleRepository>();}}}using System;using System.Collections.Generic;using System.Web;using System.Web.Mvc;using Microsoft.Practices.Unity;namespace App.Core{public class UnityDependencyResolver : IDependencyResolver{private const string HttpContextKey = "perRequestContainer";private readonly IUnityContainer _container;public UnityDependencyResolver(IUnityContainer container){_container = container;}public object GetService(Type serviceType){if (typeof(IController).IsAssignableFrom(serviceType)){return ChildContainer.Resolve(serviceType);}return IsRegistered(serviceType) ? ChildContainer.Resolve(serviceType) : null;}public IEnumerable<object> GetServices(Type serviceType){if (IsRegistered(serviceType)){yield return ChildContainer.Resolve(serviceType);}foreach (var service in ChildContainer.ResolveAll(serviceType)){yield return service;}}protected IUnityContainer ChildContainer{get{var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;if (childContainer == null){HttpContext.Current.Items[HttpContextKey] = childContainer = _container.CreateChildContainer();}return childContainer;}}public static void DisposeOfChildContainer(){var childContainer = HttpContext.Current.Items[HttpContextKey] as IUnityContainer;if (childContainer != null){childContainer.Dispose();}}private bool IsRegistered(Type typeToCheck){var isRegistered = true;if (typeToCheck.IsInterface || typeToCheck.IsAbstract){isRegistered = ChildContainer.IsRegistered(typeToCheck);if (!isRegistered && typeToCheck.IsGenericType){var openGenericType = typeToCheck.GetGenericTypeDefinition();isRegistered = ChildContainer.IsRegistered(openGenericType);}}return isRegistered;}}}UnityDependencyResolver.cs在系统开始运行时候我们就把构造函数注入。所以我们要在Global文件写入代码 
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Http;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using App.Core;using Microsoft.Practices.Unity;namespace App.Admin{// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,// 请访问 http://go.microsoft.com/?LinkId=9394801public class MvcApplication : System.Web.HttpApplication{protected void Application_Start(){AreaRegistration.RegisterAllAreas();WebApiConfig.Register(GlobalConfiguration.Configuration);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);//启用压缩BundleTable.EnableOptimizations = true;BundleConfig.RegisterBundles(BundleTable.Bundles);AuthConfig.RegisterAuth();//注入 Iocvar container = new UnityContainer();DependencyRegisterType.Container_Sys(ref container);DependencyResolver.SetResolver(new UnityDependencyResolver(container));}}}Global.asax.cs好了,我们已经把