DI 依赖注入之StructureMap框架
DI 依赖注入之StructureMap框架
一.简叙:
structureMap只是DI框架中的其中之一。
二.安装及使用:
1.懒人方法:
使用MVC5项目时,可以直接在nuget程序包中安装StructureMap.MVC5;(根据自己的mvc版本安装对应的)
使用webapi项目时,可以直接在nuget程序包中安装StructureMap.WebApi2
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.勤快人方法:(手动需要写几个类)
通过nuget方式安装structureMap框架,版本根据自己的项目需要选择。
(1)创建容器:
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; } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2016-05-26 WeChat 微信公众号开发步骤