前言

一个偶然的机会接触到了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)的更多相关文章

  1. Unity(IOC)学习笔记

    原文:Unity(IOC)学习笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79432 ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  4. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  5. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  8. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  9. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. FFMPEG + SDL音频播放分析

    目录 [hide] 1 抽象流程: 2 关键实现: 2.1 main()函数 2.2 decode_thread()读取文件信息和音频包 2.3 stream_component_open():设置音 ...

  2. 【转】This version of the rendering library is more recent than your version of ADT plug-in. Please update ADT plug-in

    原文网址:http://1982106a.blog.163.com/blog/static/8436495620149239361692/ 预览layout.xml文件时提示: This versio ...

  3. 在stm32上移植wpa_supplicant(二)

    第一层调用的移植和裁剪. wpa_supplicant_init 照论文的指示,删除wpa_params和wpa_global相关的东西.初始化流程也相当简单,driver初始化,eap_regist ...

  4. javascript将json转字符串

    例如: var last=obj.toJSONString(); //将JSON对象转化为JSON字符 或者 var last=JSON.stringify(obj); //将JSON对象转化为JSO ...

  5. mybatis中的变量#与$

    ibatis中使用select top #num# * from tableName出现错误.由于初次用ibatis还不知道在它里边拼写SQL语句的一些规则,导致一些自认为很平常的SQL语句,在它这里 ...

  6. Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境

    一. Storm集群组件 Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node).其分别对应的角色如下: 主控节点(Master Node)上运行一个被称为N ...

  7. Richedit使用大全

    原文地址:http://blog.csdn.net/pcseye/article/details/3903333 一.常见问题 a.可以编译,不能执行的 AfxInitRichEdit(); b.升级 ...

  8. 仿酷狗音乐播放器开发日志二十三 修复Option控件显示状态不全的bug(附源码)

    转载请说明原出处,谢谢~~ 整个仿酷狗工程的开发将近尾声,现在还差选项设置窗体的部分,显然在设置窗体里用的最多的就是OptionUI控件,我在写好大致的布局后去测试效果,发现Option控件的显示效果 ...

  9. NGUI的UIProgressBar使用裁剪方式而不是压缩方式的方法

    UIProgressBar默认的方式是压缩图片,而如果我们需要裁减图片,只需要将UIProgressBar的Foreground的UISprite的Type改为Filled就行了. 好几个“的”... ...

  10. Motan学习开篇

    你已经走到这里了,后面只要耐心的走下去就行了.   --佚名 入职新公司以后,公司使用dubbo框架,简单的照葫芦画瓢之后,也算是入手了,但是其中内部的实现的机制一概不懂.我单纯的有种好奇心,觉得每个 ...