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;
}
}
}
DI 依赖注入之StructureMap框架的更多相关文章
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- JAVAWEB 一一 Spirng(框架,IOC控制反转,DI依赖注入)
jar包 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <bea ...
- 三大框架 之 Spring(IOC控制反转、DI依赖注入)
目录 常用词汇 left join与left outer join的区别 Struts2的标签库导入 Spring Spring概述 什么是Spring spring特点 下载 IOC 什么IOC 传 ...
- Spring-初识Spring框架-IOC控制反转(DI依赖注入)
---恢复内容开始--- IOC :控制反转 (DI:依赖注入)使用ioc模式开发 实体类必须有无参构造方法1.搭建Spring环境下载jarhttp://maven.springframework. ...
- 谈谈php里的IOC控制反转,DI依赖注入
理论 发现问题 在深入细节之前,需要确保我们理解"IOC控制反转"和"DI依赖注入"是什么,能够解决什么问题,这些在维基百科中有非常清晰的说明. 控制反转(In ...
- IoC控制反转与DI依赖注入
IoC控制反转与DI依赖注入 IoC: Inversion of Control IoC是一种模式.目的是达到程序的复用.下面的两篇论文是对IoC的权威解释: InversionOfControl h ...
- AngularJS DI(依赖注入)实现推测
AngularJS DI(依赖注入) http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html 回到angularjs:在框架中 ...
- AutoFac IoC DI 依赖注入
AutoFac IoC DI 依赖注入 记录点点滴滴知识,为了更好的服务后来者! 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌 ...
- 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。
轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战 ...
随机推荐
- 塔防游戏 Day3
1. 添加按钮动画 选择 Button->Transition 为 Animation ,然后自定义四种状态动画即可. 2. 控制升级面板的显示和隐藏 // 升级处理 // 若点击同一炮塔,并且 ...
- Spring3.0+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务
一.概念 分布式事务分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上.简言之,同时操作多个数据库保持事务的统一,达到跨库事务的效果. JTA ...
- REST介绍与REST在PHP中的应用
当HTTP被发明出来的时候,其实REST就已经存在了.可惜这么多年来,WEB开发模式却越来越背离HTTP的本质,舍本逐末的追求起RPC之类的东西.此时REST重新回到人们的视线里,无疑让大家开始反思过 ...
- 一道面试题Lintcode196-Find the Missing Number
http://www.lintcode.com/en/problem/find-the-missing-number/# Find the Missing Number Given an array ...
- 文件操作类File
File类:提供用于创建.复制.删除.移动和打开文件的静态方法.File类 FileInfo类:提供创建.复制.删除.移动和打开文件的属性和实例方法.FileInfo类 Directory类:公开用于 ...
- style多次设置行内样式
语法 style="font-size:32px;background-color:#aaa"
- IIS网站最大并发连接数
打开网站服务器IIS---[控制面板]-[管理工具]--[Internet信息服务IIS管理器] 打开应用程序池--找到网站对应使用的应用程序池--选择右侧[高级设置] 在[高级设置]窗口可看 ...
- java 将一个数组中的值按逆序重新存放,例如,原来顺序为:9,5,7,4,8,要求改为:8,4,7, 5,9。
public class Test3 { public static void main(String[] args) { int[] grade = {87,88,89,98,78}; int m; ...
- leetCode--towSum
题目链接:https://leetcode.com/problems/two-sum/description/ 此题的意思是:给定一个target值,从给定的数组中找两个数,使得这两个数的和==tar ...
- Storm的StreamID使用样例(版本1.0.2)
随手尝试了一下StreamID的的用法.留个笔记. ==数据样例== { "Address": "小桥镇小桥中学对面", "CityCode" ...