使用Unity的好處網(wǎng)上有很多,百度一下即可 這里引用了一篇關(guān)于面向接口編程的好處的文章作為引申:https://blog.csdn.net/Cyy19970527/article/details/83177996 在MVC中使用Unity 需要引用Unity包,我安裝的版本為 Unity-4.0.1 盡管現(xiàn)在Unity最新版本已經(jīng)更新到5.11.2了,但是在使用配置文件注入的時(shí)候,總是報(bào)以下錯(cuò)誤, 百度查找到一篇文章說(shuō)是版本問(wèn)題: https://blog.csdn.net/weixin_34124577/article/details/93533679 接下來(lái)直接上測(cè)試代碼:項(xiàng)目結(jié)構(gòu)使用簡(jiǎn)單的三層結(jié)構(gòu) DAL層 namespace DAL { //聲明一個(gè)接口層,獲取名稱 public interface IADao { string GetName(); } } //實(shí)現(xiàn)1 public class A1Dao : IADao { public string GetName() { return "我叫A1"; } } //實(shí)現(xiàn)2 public class A2Dao : IADao { public string GetName() { return "我叫A2"; } } BLL層 namespace BLL { //聲明一個(gè)Bll層接口 public interface IA { string GetName(); } } //實(shí)現(xiàn)1 public class A1 : IA { IADao _a1; //構(gòu)造函數(shù)注入 [InjectionConstructor] public A1(IADao a1) { _a1 = a1; } public string GetName() { return _a1.GetName(); } } //實(shí)現(xiàn)2 public class A2 : IA { //屬性注入 "a2dao" 是區(qū)分兩個(gè)不同實(shí)現(xiàn)的標(biāo)識(shí),在配置文件中聲明該名稱 [Dependency("a2dao")] public DAL.IADao _a1 { get; set; } public string GetName() { return _a1.GetName(); } } 在控制器中調(diào)用 public class HomeController : Controller { //通過(guò)屬性注入 [Dependency("a2")] public IA _a2 { get; set; } private IA _ia; 顯示結(jié)果: 接下來(lái)說(shuō)如何配置 1,首先要引用Unity插件 2,然后在App_Start 文件夾下創(chuàng)建一個(gè)注冊(cè)配置類UnityConfig (引用插件的時(shí)候會(huì)自動(dòng)創(chuàng)建,自定義也可以),用來(lái)注冊(cè)配置文件Unity.config中的配置, /// <summary> /// 配置文件公用類 /// </summary> public class UnityConfig { /// <summary> /// MVC注入 在全局方法中調(diào)用該方法,實(shí)現(xiàn)全局注冊(cè) /// </summary> public static void Start() { var container = ApiContainer.GetUnityContainer(); RegisterTypes(container); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); //MVC注入 } /// <summary> /// 使用配置文件注冊(cè) /// </summary> /// <param name="container"></param> private static void RegisterTypes(IUnityContainer container) { //使用單獨(dú)的Unity.config配置文件 var filepath = HttpRuntime.AppDomainAppPath; var context = HttpContext.Current; if (context != null) { filepath = context.Server.MapPath("~/"); } var getfile = filepath + "Unity.config"; var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = getfile }; Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); var unitySection = (UnityConfigurationSection)configuration.GetSection("unity"); container.LoadConfiguration(unitySection, "defaultContainer"); //在App.config或者Web.Config中配置 //UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); //container.LoadConfiguration(section, "defaultContainer"); //或者section.Configure(container, "defaultContainer"); } } 3,然后同樣在App_Start 文件夾下創(chuàng)建一個(gè)UnityDependencyResolver 類,同時(shí)實(shí)現(xiàn)接口:IDependencyResolver 1 /// <summary> 2 /// 用于自動(dòng)實(shí)現(xiàn)對(duì)象類 3 /// </summary> 4 public class UnityDependencyResolver : IDependencyResolver 5 { 6 IUnityContainer container; 7 public UnityDependencyResolver(IUnityContainer container) 8 { 9 this.container = container; 10 } 11 12 public object GetService(Type serviceType) 13 { 14 try 15 { 16 return container.Resolve(serviceType); 17 } 18 catch 19 { 20 return null; 21 } 22 } 23 24 public IEnumerable<object> GetServices(Type serviceType) 25 { 26 try 27 { 28 return container.ResolveAll(serviceType); 29 } 30 catch 31 { 32 return new List<object>(); 33 } 34 } 35 } 4,寫一個(gè)Unity公共類,也可以將該類集成到項(xiàng)目中 /// <summary> /// Unity公共類 /// </summary> public class ApiContainer { private readonly static IUnityContainer _container = null; /// <summary> /// 初始化容器 /// </summary> /// <returns></returns> static ApiContainer() { //新建容器構(gòu)建器,用于注冊(cè)組件和服務(wù) _container = new UnityContainer(); } /// <summary> /// 對(duì)外開(kāi)放函數(shù) 獲取Unity容器 /// </summary> /// <returns></returns> public static IUnityContainer GetUnityContainer() { return _container; } /// <summary> /// 獲取實(shí)例 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T GetServer<T>() { return _container.Resolve<T>(); } /// <summary> /// 可以根據(jù)ConfigName獲取實(shí)例 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="ConfigName">配置文件中指定的文字</param> /// <returns></returns> public static T GetServer<T>(string ConfigName) { return _container.Resolve<T>(ConfigName); } /// <summary> /// 返回構(gòu)結(jié)函數(shù)帶參數(shù) /// </summary> /// <typeparam name="T">依賴對(duì)象</typeparam> /// <param name="ConfigName">配置文件中指定的文字(沒(méi)寫會(huì)報(bào)異常)</param> /// <param name="parameterList">參數(shù)集合(參數(shù)名,參數(shù)值)</param> /// <returns></returns> public static T GetServer<T>(Dictionary<string, object> parameterList) { var list = new ParameterOverrides(); foreach (KeyValuePair<string, object> item in parameterList) { list.Add(item.Key, item.Value); } return _container.Resolve<T>(list.OnType<T>()); } } 5,在項(xiàng)目根目錄下創(chuàng)建一個(gè) Unity.config 文件,配置如下 <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/> </configSections> <unity> <containers> <container name="defaultContainer"> <register type="BLL.IA,BLL" mapTo="BLL.A1, BLL"/> <register type="BLL.IA,BLL" mapTo="BLL.A2, BLL" name="a2" /> <register type="DAL.IADao,DAL" mapTo="DAL.A1Dao, DAL"/> <register type="DAL.IADao,DAL" mapTo="DAL.A2Dao, DAL" name="a2dao"/> </container> </containers> </unity> </configuration> 6,在全局中注冊(cè) Global.asax.cs public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); UnityConfig.Start(); //全局注冊(cè) 可通過(guò)構(gòu)造函數(shù)or屬性調(diào)用 } } 到此全部結(jié)束 如果要在 WebAPI中使用Unity,則除了引用Unity插件,還要引用 Unity.WebApI 插件,引用版本如下: 然后需要調(diào)整一處地方,將MVC的注入方式換成WebAPI的注入方式,如下: using System; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.WebApi; using System.Web.Http; 另外需要去掉上邊代碼中的 UnityDependencyResolver : IDependencyResolver 實(shí)現(xiàn)。API的不需要實(shí)現(xiàn)如下接口, 去掉如下圖的實(shí)現(xiàn)。
其他的地方都一樣。
參考文章: https://www.cnblogs.com/qqlin/archive/2012/10/18/2720828.html https://blog.csdn.net/hezheqiang/article/details/80255280
|
|