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: 定义因特网服务的类型,常见的为 ...
随机推荐
- Java与WCF交互(一)补充:用WSImport生成WSDL的Java客户端代码
在<Java与WCF交互(一):Java客户端调用WCF服务>一 文中,我描述了用axis2的一个Eclipse控件生成WCF的Java客户端代理类,后来有朋友建议用Xfire.CXF,一 ...
- ASP.NET CORE Web浏览器和Web服务器
//web浏览器 //浏览器本质的原理:浏览器向服务器发请求,服务器把请求的内容返回给浏览器,然后浏览器把返回的内容绘制成一个图形化的界面 //Socket一种通讯交流的技术 //qq用户把信息通过s ...
- 在PC上收发短信--Pidgin短信(Linux Pidgin插件)
Pidgin短信是Pidgin/empathy的一个插件.当手机收到短信进,电脑上面有提示:可以在电脑上发手机短信.让你时刻保持在电脑屏幕上,也不会错过短信.目前只支持安卓,wifi连接方式. 功能 ...
- LightOJ 1427 -Repository(ac自动机)
题意: 求每个模式串在母串中出现的次数 #include <map> #include <set> #include <list> #include <cma ...
- 《Nagios系统监控实践》勘误
在翻译的过程中,虽然反反复复的检查了很多遍,但依然有所遗漏——这不,今天就收到了 @我是晓梦 的回复,指出了书中的一些错误. 从今天起,建立勘误表,记录这些错误,以便在下一次印刷时纠正,并对广大读者致 ...
- js代码大全(里面啥都有)
事件源对象event.srcElement.tagNameevent.srcElement.type 捕获释放event.srcElement.setCapture(); event.srcElem ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- STL六大组件之——仿函数偷窥
仿函数(functor),就是使一个类或类模板的使用看上去象一个函数.其实现就是类或类模板中对operator()进行重载,这个类或类模板就有了类似函数的行为.仿函数是智能型函数就好比智能指针的行为像 ...
- LeetCode题解——Roman to Integer
题目: 将罗马数字转换为整数. 解法: 可以参考上一篇数字转换为罗马数字的规则. 代码: class Solution { public: int sym2int(char sym) //罗马数字字符 ...
- sql-case列转行
1:对列进行逻辑判断 select ID,Score, case when Score>=90 then 'A' when Score>=80 then 'B' when Score> ...