StructureMap 是一個非常靈巧的IOC架構,與asp.net MVC 更是很好的整合。
準備:
下載StructureMap,基本執行個體中只需要引用StructureMap.dll檔案,並引用命名空間StructureMap
下面是我們需要使用IoC的範例程式碼,我們要建立TestController,希望通過IoC為TestController的建構函式提供Ants.Provider.ICacheProvider的執行個體對象。
Step1:
用StructureMapControllerFactory代替預設的DefaultControllerFactory,以及StructureMap的初始化,並在Application_Start()進行註冊。
1.StructureMapControllerFactory代替預設的DefaultControllerFactory以及StructureMap的初始化
using System;using System.Web.Mvc;using StructureMap;namespace MvcWeb.Ioc{ //用StructureMap接管MVC中的Controller的建立工作 public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType) { if (controllerType == null) return null; try { return ObjectFactory.GetInstance(controllerType) as Controller; } catch (StructureMapException) { System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave()); throw; } } } //初始化StructureMap,注入相關對象 public class StructureMapInitialize { public static void Initialize() { ObjectFactory.Initialize( x => { x.For<Ants.Provider.IAuthenticateProvider>().Singleton().Use<Ants.Provider.CustomAuthenticateProvider>(); x.For<Ants.Provider.ICacheProvider>().Singleton().Use<Ants.Provider.AspNetCacheProvider>(); } ); } } }
2.在Application_Start()進行註冊
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterRoutes(RouteTable.Routes); //初始化StructureMap MvcWeb.Ioc.StructureMapInitialize.Initialize(); //註冊StructureMapControllerFactory以代替DefaultControllerFactory ControllerBuilder.Current.SetControllerFactory(new MvcWeb.Ioc.StructureMapControllerFactory()); }
Step2:構建TestControler
using System.Web.Mvc;namespace MvcWeb.Controllers{ [HandleError] public class TestController : Controller { //_cache將會被自動注入 private readonly Ants.Provider.ICacheProvider _cache; public TestController(Ants.Provider.ICacheProvider cache) { this._cache = cache; } /********************************************** Test/Cache **********************************************/ public ActionResult Cache() { _cache.Insert("test", "Hello Word"); return Content(_cache.Get("test").ToString()); } }}
Step3:直接瀏覽Test/Cache 就可以看到成功的顯示“Hello World”.