DI 依賴注入之StructureMap框架web
一.簡敘:api
structureMap只是DI框架中的其中之一。mvc
二.安裝及使用:框架
1.懶人方法:this
使用MVC5項目時,能夠直接在nuget程序包中安裝StructureMap.MVC5;(根據本身的mvc版本安裝對應的)spa
使用webapi項目時,能夠直接在nuget程序包中安裝StructureMap.WebApi2code
public class DefaultRegistry : Registry { #region Constructors and Destructors public DefaultRegistry() { Scan( scan => { scan.TheCallingAssembly(); scan.WithDefaultConventions(); }); //For<IExample>().Use<Example>(); For<AWSW.IDAL.IUserDAL>().Use<AWSW.DAL.UserDAL>(); For<AWSW.IBLL.IUserBLL>().Use<AWSW.BLL.UserBLL>(); } #endregion }
2.勤快人方法:(手動須要寫幾個類)blog
經過nuget方式安裝structureMap框架,版本根據本身的項目須要選擇。接口
(1)建立容器:get
public class IoC { public static IContainer Initialize() { return new Container(x => { x.AddRegistry<DefaultRegistry>(); }); } }
(2)註冊:
public class DefaultRegistry : Registry { public DefaultRegistry() { Scan(x => { x.TheCallingAssembly(); x.WithDefaultConventions(); }); For<IUserDAL>().Use<UserDAL>(); For<IUserBLL>().Use<UserBLL>(); } }
(3)調用:(global.asax文件中調用來初始化容器)
var container = IoC.Initialize();
【到此步,在沒有使用mvc或webapi項目的時候已經完了】
(4)mvc使用
SetResoler參數是實現IDependencyResolver的類,因此咱們寫個實現它的類,實現便可
DependencyResolver.SetResolver(new MVCStructureMapDependencyResolver(container));
實現IDependencyResolver接口的類
public class MVCStructureMapDependencyResolver : IDependencyResolver { IContainer _container; public MVCStructureMapDependencyResolver(IContainer container) { this._container = container; } public object GetService(Type serviceType) { try { return this._container.GetInstance(serviceType); } catch (Exception) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return this._container.GetAllInstances(serviceType).Cast<object>(); } catch (Exception) { return null; } } }
(5)webapi使用:
DependencyResolver的屬性須要一個實現IDependencyResolver接口類,而且IDependencyResolver接口內BeginScope的方法返回值又是個接口IDependencyScope,因而還得去實現它。就有了以下的代碼:
GlobalConfiguration.Configuration.DependencyResolver = new WebApiStructureMapDependencyResolver(container);
public class WebApiStructureMapDependencyResolver : WebApiStructureMapDependencyScope, IDependencyResolver { IContainer container; public WebApiStructureMapDependencyResolver(IContainer container) : base(container) { this.container = container; } IDependencyScope IDependencyResolver.BeginScope() { return new WebApiStructureMapDependencyScope(container); } } public class WebApiStructureMapDependencyScope : IDependencyScope { IContainer container; public WebApiStructureMapDependencyScope(IContainer container) { this.container = container; } public void Dispose() { this.container.Dispose(); } public object GetService(Type serviceType) { try { return container.GetInstance(serviceType); } catch (Exception) { return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return container.GetAllInstances(serviceType).Cast<object>(); } catch (Exception) { return null; } } }