亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Unity IOC注入詳細配置(MVC,WebApi)

2019-11-17 01:42:50
字體:
來源:轉載
供稿:網友

Unity IOC注入詳細配置(MVC,WebApi)

一直想寫一篇關于unity 詳細的配置信息的文章,也算是自我總結吧

先介紹了unity , Unity是微軟官方推薦使用的輕型的IOC框架,支持各種方式的注入 ,使用來解耦的利器.

獲取unity 的方式呢你可以直接下載對應的dll文件或者去對應的網站下載,我個人推薦呢用NuGet直接添加和管理.

添加方式如下圖

安裝之后呢會自動添加到項目里,當有更新的時候,直接在窗口里面更新就行,或者執行命令行Update-Package Mvc{tab}

,如果你只需要注入普通的MVC的話那現在啊就可以了。但是如果你可能還需要注入webapi的話那么你就還需要引入這個庫

磨刀不誤砍柴工,包準備好了現在可以開始配置了,

總的來說unity的配置分為3步

1:填寫配置文件指定映射關系

2:創建容器載入配置文件

3:構造注入或者屬性注入。

完成了這幾步呢就可以開始使用了

先說配置文件吧。先發個圖看看完整的結構

其實看這很負責用起來的話不是這樣,如果你只是簡單來用的話其實就只需要關注5個節點

<?xml version="1.0" encoding="utf-8"?><configuration>  <configSections>    <section name="unity" type="Microsoft.PRactices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>  </configSections>  <unity>            <alias alias="IClass" type="IservicesVc.test, IservicesVc" />    <alias alias="MyClass" type="Services.test, Services" />        <namespace name="IservicesVc.test" />    <namespace name="Services.test" />        <assembly name="IservicesVc" />    <assembly name="Services" />        <container>         <register type="Itesttwo" mapTo="testtwo" />      <register type="ITestIoc" mapTo="TestIo" />    </container>  </unity></configuration>

從上往下看呢首先<alias>節點用來指定程序集之間的映射關系 alias是表示節點的別名,type是指定類型用的 "結構為命名空間+文件名,命名空間",,<namespace>用來指定引用程序集的命名空間 name屬性=命名空間+文件夾名稱(如果是多個映射),<assembly > name="程序命名空間" 用來指定引用的程序集

<container> 就是容器節點了。里面的<register>節點用來用的類之間的映射關系,type="需要映射的類型",mapto="映射的目標類型" 下面貼下對應的代碼

namespace IservicesVc.test{    public interface ITestIoc    {        int sum(int sumone, int sumtwo);    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace IservicesVc.test{    public interface Itesttwo    {        int count(int i, int j);    }}
using IservicesVc.test;namespace Services.test{    public class TestIo :ITestIoc    {      public  int sum(int sumone, int sumtwo)      {          return sumone + sumtwo;      }    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using IservicesVc.test;using Microsoft.Practices.Unity;namespace Services.test{ public   class testtwo:Itesttwo        {     [Dependency]     public ITestIoc ii { get; set; }     public int count(int i, int j)     {         var sum = ii.sum(i,j);         return sum * sum;     }    }}

配置完成后呢。就是需要開始注冊了。

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 TestUnityIocVC.App_Start;namespace TestUnityIocVC{    public class WebApiapplication : System.Web.HttpApplication    {        protected void Application_Start()        {            AreaRegistration.RegisterAllAreas();            GlobalConfiguration.Configure(WebApiConfig.Register);            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);            RouteConfig.RegisterRoutes(RouteTable.Routes);            BundleConfig.RegisterBundles(BundleTable.Bundles);            //注入方法            Bootstrapper.Initialise();        }    }}

重點是Bootstrapper.Initialise();方法

using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Web;using System.Web.Http;using System.Web.Mvc;using IservicesVc.test;using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration;using Services.test;using Unity.WebApi;namespace TestUnityIocVC.App_Start{    public static class Bootstrapper    {        public static void Initialise()        {            //UnityContainer container = new UnityContainer();            //UnityConfigurationSection configuration = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection;            //configuration.Configure(container, "defaultContainer");              var container = BuildUnityContainer();            DependencyResolver.SetResolver(new UnityDependencyResolver(container));//MVC注入                   //GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);//MVC            GlobalConfiguration.Configuration.DependencyResolver = new  Unity.WebApi.UnityDependencyResolver(container);//WebAPi注入        }        /// <summary>        /// Builds the unity container.        /// </summary>        /// <returns></returns>        private static IUnityContainer BuildUnityContainer()        {            var container = new UnityContainer();            //container.RegisterType<INodeBiz, NodeBiz>();            var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = HttpContext.Current.Server.MapPath("~/Unity.config") };            Configuration configuration =                ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);            var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");            container.LoadConfiguration(unitySection);            //container.RegisterType<ITestIoc, TestIo>();            return container;        }    }}

通過BuildUnityContainer方法構造容器, 容器的結構是從配置文件的讀取的,但是現在你如果運行會報錯為什么呢,因為你如果需要MVC注入的話還需要一些別的處理.

我們要實現MVC3中新提供 的兩個接口:IDependencyResolver和IControllerActivator

IDependencyResolver公開兩個方法 - GetService的GetServices.The GetService方法解決了單獨注冊的服務,支持任意對象的創建,GetServices解決注冊多個服務。IDependencyResolver接口的實現應該委托給底層的依賴注入容器提供注冊服務請求的類型。當有沒有注冊的服務請求的類型,asp.net MVC框架預計這個接口的實現返回GetService為空,并從GetServices返回空集合。讓我們以統一提供依賴注入工作IDependencyResolver intreface派生創建一個自定義的依賴解析器類。

我們定義一個類名為UnityDependencyResolver:

using System;using System.Collections.Generic;using System.Web.Mvc;using Microsoft.Practices.Unity;namespace TestUnityIocVC{    public class UnityDependencyResolver : IDependencyResolver    {        IUnityContainer container;        public UnityDependencyResolver(IUnityContainer container)        {            this.container = container;        }        public object GetService(Type serviceType)        {            try            {                return container.Resolve(serviceType);            }            catch            {                return null;            }        }        public IEnumerable<object> GetServices(Type serviceType)        {            try            {                return container.ResolveAll(serviceType);            }            catch            {                return new List<object>();            }        }    }}

實現兩個方法GetService和GetServices。使用Unity容器返回我們需要的Service或者ojbect。

實現兩個方法GetService和GetServices。使用Unity容器返回我們需要的Service或者ojbect。

ASP.NET MVC 3以后的版本已經推出了一個新的接口IControllerActivator,讓您激活與自定義的行為控制器,并且可以使用依賴注入.讓我們創建一個派生自IControllerActivator 接口的一個自定義的控制器

Icontroller

using System;using System.Web.Mvc;namespace TestUnityIocVC{    public class CustomControllerActivator : IControllerActivator    {        IController IControllerActivator.Create(System.Web.Routing.RequestContext requestContext,            Type controllerType)        {            return DependencyResolver.Current                .GetService(controllerType) as IController;        }    }}

到這。整個注冊就完成了

那么在MVC 的控制器和webapi中就可以用了

(MVC)

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using IservicesVc;using IservicesVc.test;using Microsoft.Practices.Unity;using Services.test;namespace TestUnityIocVC.Controllers{    public class HomeController : Controller    {        //屬性注入;        [Dependency]        public ITestIoc _TestIoc { get; set; }        public Itesttwo test = DependencyResolver.Current.GetService<Itesttwo&g
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产视频日韩| 精品国产电影一区| 欧美激情视频在线观看| 青青在线视频一区二区三区| 欧美日本精品在线| 欧美一级黑人aaaaaaa做受| 在线观看国产成人av片| 国产精品成人品| 精品呦交小u女在线| 91精品啪在线观看麻豆免费| 欧美亚洲视频在线看网址| 国内久久久精品| 亚洲精品成人久久电影| 国产精品v日韩精品| 国产精品美女久久久久av超清| 自拍偷拍亚洲一区| 成人福利视频网| 国产成人在线视频| 日韩在线一区二区三区免费视频| 国产一区二区三区中文| 午夜精品福利电影| 国产在线观看不卡| 亚洲精品xxxx| 精品国产视频在线| 久久久久久久av| 国产日韩中文在线| 亚洲一区二区三区在线免费观看| 久久久精品国产一区二区| 中文字幕久热精品视频在线| 亚洲国产精品成人精品| 国产亚洲精品美女| 91九色视频导航| 精品国偷自产在线| 日韩电影免费在线观看中文字幕| 国内免费久久久久久久久久久| 日韩精品高清在线观看| 国产精品久久久久久久美男| 精品国产一区二区三区久久狼黑人| 国产精品久久久久久久久久久新郎| 欧美高清在线视频观看不卡| 亚洲男人天天操| 亚洲欧美变态国产另类| 国产精品久久久久久亚洲影视| 亚洲最大av在线| xx视频.9999.com| 国产成人免费av| 国产精品第一区| 久久99热精品这里久久精品| 2020国产精品视频| 国产精品女人久久久久久| 中文字幕亚洲无线码a| 日韩美女视频免费看| 久久香蕉国产线看观看网| 国产精品久久久久久久久免费| 久久久999精品| 欧美黄色小视频| 日本久久久a级免费| 国产精品伦子伦免费视频| 91久久久久久久一区二区| 日产精品久久久一区二区福利| 久久久91精品国产一区不卡| 中文字幕亚洲综合久久筱田步美| 成人激情在线播放| 国产精品伦子伦免费视频| 欧美激情精品久久久久久变态| 丝袜美腿亚洲一区二区| 亚洲а∨天堂久久精品9966| 欧美日韩国产在线| 欧美不卡视频一区发布| 国产一区二区三区在线观看网站| 日韩一区二区三区在线播放| 欧美成人激情在线| 国产精品极品尤物在线观看| 色综久久综合桃花网| 日本成人黄色片| 亚洲精品一区在线观看香蕉| 日韩在线资源网| 这里精品视频免费| 亚洲国产精品一区二区三区| 日韩精品在线免费播放| 久久人体大胆视频| 欧美乱大交做爰xxxⅹ性3| 97久久精品人人澡人人爽缅北| 日韩精品在线播放| 韩国一区二区电影| 国产精品美女在线| 国产剧情日韩欧美| 久久综合亚洲社区| 日韩h在线观看| 这里只有精品在线播放| 日韩视频在线观看免费| 国产精品吹潮在线观看| 中文日韩电影网站| 国产精品va在线播放我和闺蜜| 欧美激情欧美激情在线五月| 亚洲女人被黑人巨大进入| 亚洲精品综合久久中文字幕| 一区二区在线免费视频| 亚洲精品免费一区二区三区| 国产ts一区二区| 91网在线免费观看| 亚洲国产天堂久久综合网| 中文字幕不卡av| 午夜免费久久久久| 国产又爽又黄的激情精品视频| 国产精品视频久久| 中文字幕欧美日韩在线| 成人免费黄色网| 久久久视频在线| 亚洲天堂日韩电影| 91sa在线看| 欧美日韩国产丝袜美女| 国产精品情侣自拍| 91成人精品网站| 亚洲欧美国产精品专区久久| 欧美日韩成人精品| 2020欧美日韩在线视频| 欧美尺度大的性做爰视频| 久久99精品久久久久久青青91| 在线观看免费高清视频97| 欧美高清videos高潮hd| 国产区精品视频| 国产精品永久免费在线| 97久久精品在线| www.欧美精品| 欧美精品videos另类日本| 国产精品自在线| 欧美孕妇与黑人孕交| 久久精品最新地址| 色婷婷亚洲mv天堂mv在影片| 久热精品视频在线观看| 免费91在线视频| 欧美日韩一区二区精品| 亚洲成人精品av| 亚洲免费人成在线视频观看| 91免费人成网站在线观看18| 一本色道久久88精品综合| 亚洲爱爱爱爱爱| 成人国内精品久久久久一区| 国产在线精品播放| 亚洲午夜av久久乱码| 亚洲精品影视在线观看| 久久久久久久一区二区三区| 国产精品日韩电影| 日韩在线免费视频观看| 日韩在线观看精品| 日韩少妇与小伙激情| 一本大道久久加勒比香蕉| 欧美激情xxxx| 国产精品专区h在线观看| 日韩中文字幕在线观看| 亚洲国产精品99久久| 视频在线观看一区二区| 超碰日本道色综合久久综合| 欧美亚洲视频在线看网址| 日韩av免费看| 中文字幕少妇一区二区三区| 成人黄色在线播放| 久久久国产精品一区| 日韩中文字幕视频在线观看| 日韩精品视频在线免费观看| 国产一区二区三区高清在线观看| 亚洲免费视频观看| 精品国产欧美一区二区五十路|