StructureMap 学习笔记(1)
前言
一个偶然的机会接触到了StructureMap,当时客户要求让程序具有较好的测试性,自然而然就想到了IOC 容器。 之后就去Google了一下, 不经意间在StackOverFlow找到一篇帖子推荐使用StructureMap, 然后就稀里糊涂的引用到了项目中使用了。
依我看来,StructureMap很容易上手,照着官网(http://docs.structuremap.net/QuickStart.htm) 的例子,很快就能使用。 渐渐地也熟悉了StructureMap的用法,但只是会用,而没有深入的了解。 近段时间一直在学习设计模式,并且想看一些开源的项目, 于是乎就想深入了解StructureMap, 并且写博客总结梳理下。
由于本人语文是数学老师教的, 表达不当,请见谅!
快速入门
假设有这样一个场景,我们使用Repository Pattern作为数据访问层的设计模式, 为了降低它与业务逻辑层的耦合,使用StructureMap实现依赖注入,那么我们需要一个IRepository的接口
public interface IRepository
{
void SaveChanges();
}
此外我们需要一个实现类
public class Repository: IRepository
{
public Repository(string connectionString)
{
} public void SaveChanges()
{
return;
}
}
此时我们需要做的是让StructureMap实例化IRepository, 那么就必须对StructureMap进行配置
ObjectFactory.Initialize(x =>
{
//以下调用只能用于Repository的构造函数只有1个String类型的参数, 否则抛错
x.For<IRepository>().Use<Repository>().Ctor<string>().Is("Dely"); });
本段代码的作用是配置接口与实现类的映射关系和构造函数参数的设置:
- x.For<IRepository>().Use<Repository> 是指如果用户请求IRepository的实例,那么StructureMap会调用Repository类的构造函数并返回此实例
- Ctor<string>().Is("Dely") 指将Repository构造函数的string类型参数的值设置为"Dely"
至此,就可以使用以下代码获取IRepository的实例
var repository = ObjectFactory.GetInstance<IRepository>();
ObjectFactory会调用Repository的构造函数,并将字符串"Dely"传递给构造函数参数connectionString

注意: 如果Repository的构造方法有多个同类型的参数,ObjectFactory.GetInstance<IRepository>() 就会抛出配置错误的异常,例如,修改Repository的构造函数
public Repository(string connectionString, string connectionString2)
{
}
要是先前的代码能够正常工作,我们必须要修改StructureMap的配置, 并显示的指定每一个参数的值
//如果Repository的构造函数有多个相同类型的参数,就必须使用Ctor([参数名])指定每一个参数的值, 否则抛错
x.For<IRepository>().Use<Repository>().Ctor<string>("connectionString").Is("Dely").Ctor<string>("connectionString2").Is("connection");
- Ctor<string>("connectionString").Is("Dely") 指定参数名为connectionString的string类型参数的值为"Dely"
- Ctor<string>("connectionString2").Is("connection")指定参数名为connectionString2的string类型参数的值为"connection"
ObjectFactory.GetInstance<IRepository>() 就可以使用以上的配置,实例化一个Repository, 但是是真实的场景中,这样的HardCode设置连接字符串是不合理的,通常会从配置文件中获取。那么 StructureMap 支持从配置文件中取数据并传递给构造函数么? 答案是肯定的
//如果Repository的构造函数的某个参数需要来自于配置文件, 可以使用Ctor<>().EqualToAppSeting() 指定对应的AppSetting的Key/Value
x.For<IRepository>().Use<Repository>().Ctor<string>("connectionString").Is("Dely").Ctor<string>("connectionString2").EqualToAppSetting("connection");
- EqualToAppSetting() 方法是从配置文件(App.config, web.config)中的AppSettings节点获取对应的Key/Value
如果配置文件中包含
<appSettings>
<add key="connection" value="Dely123"/>
</appSettings>
那么StructureMap会将key="connection" 节点value属性的值传递到名为connectionString2函数参数

总结
此文叙述了StructureMap最基本的用法和注意事项,本人觉得最核心的就是
1. 配置构造函数参数的值
2. 使用Ctor<T>(), Is<T>() , For<T>(), Use<T>(), GetInstance<>(), EqualAppSetting() 等方法
下篇博文 我将深入StructureMap内部,对本文中所用的到API进行更深入的阐述, 谢谢!
StructureMap 学习笔记(1)的更多相关文章
- Unity(IOC)学习笔记
原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
随机推荐
- Live555中RTP包的打包与发送过程分析
这里主要分析一下,live555中关于RTP打包发送的部分.在处理完PLAY命令之后,就开始发送RTP数据包了(其实在发送PLAY命令的response包之前,就会发送一个RTP包,这里传输就已经开始 ...
- Struts2中date标签乱码问题解决
1.出现的问题如下图 八月份以前没有问题,但从九月份开始就会出现乱码问题 2.开始解决 (1)在使用标签的JSP中加入: <%@taglib prefix="s" uri=& ...
- SpringMVC——实现拦截器
1. SpringMVC拦截器的概念与Struts2相同 2. 实现拦截器 (1) 项目结构 (2) 实现HandlerInterceptor接口 package com.zhengbin.contr ...
- [Papers]NSE, $u_3$, Lebesgue space [Zhou-Pokorny, Nonlinearity, 2009]
$$\bex u_3\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{3}{4}+\frac{1}{2q},\quad \fra ...
- MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...
- redis配置实例及redis.conf详细说明
一.配置实例 1.redis修改持久化路径.日志路径.清缓存 redis修改持久化路径和日志路径 vim redis.conf logfile /data/redis_cache/logs/redi ...
- MATLAB常用数据类型的转换
一直以来,在使用MATLAB进行运算的过程中,经常会用到对图像的各种处理,因此需要对图像进行数据转换,因此对经常用到的转换进行整理,方便查看. 1.uint8转化为double用来方便图像的运算: d ...
- bzoj 1419 Red is good(期望DP)
[题意] R红B蓝,选红得1选蓝失1,问最优状态下的期望得分. [思路] 设f[i][j]为i个Rj个B时的最优期望得分,则有转移式为: f[i][j]=max{ 0,(f[i-1][j]+1)*(i ...
- JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序
枚举器与数据操作 1)枚举器为我们提供了访问集合的方法,而且解决了访问对象的“数据类型不确定”的难题.这是面向对象“多态”思想的应用.其实是通过抽象不同集合对象的共同代码,将相同的功能代码封装到了枚举 ...
- Javascript手记-基本类型和引用类型
1:ecmascript包含2中不同的数据类型,基本数值类型和引用数值类型.基本数据类型是简单的数据段,引用类型是指那些可能由多个值构成的对象. 1.1:常用的基本类型:Undefined,Null, ...