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

來源:互聯網
上載者:User

標籤:blog   http   使用   os   io   檔案   ar   2014   

一直想寫一篇關於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>(); //private readonly ITestIoc _testIoc; //public HomeController(ITestIoc testIoc) //{ // _testIoc = testIoc; //} public ActionResult Index() { var count = _TestIoc.sum(10, 20); ViewBag.Title = "home"; return View(); } }}

(WEBapi)

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;using IservicesVc.test;namespace TestUnityIocVC.Controllers.Api{ public class testController : ApiController { private readonly Itesttwo _testIoc; public testController(Itesttwo testIoc) { _testIoc = testIoc; } public IEnumerable<string> Get() { var sum = _testIoc.count(10, 20); return new string[] { "value1", sum.ToString() }; } }}

。好了到這整個流程就算是結束了。這是本人第一次寫部落格。有些用語不合適或者描述的不清楚的地方請諒解。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.