前言

一个偶然的机会接触到了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. LINUX启动ORACLE监听和服务

    可通过secureCRT或者telnet直接连 启动监听命令:lsnrctl start 成功启动后:sqlplus /nolog 回车 conn / as sysdba 回车 startup 回车 ...

  2. Android平台程序崩溃的类型及原因列举

    Android平台程序崩溃大家都应该遇到过,force close和ANR应该是大家遇到较多的. 这里把Android平台程序崩溃的各种类型做一个简述和原因列举. 1.ANR(可见ANR): 发生场景 ...

  3. Oracle的OracleBulkCopy不支持事务处理

    在进行OracleBulkCopy批量数据导入的过程中使用事务后抛出了异常, 没使用事务时可以正确批量导入, ORA-12154:无法解析指定的连接字符串, 但是TNS配置肯定是没有错的, 难道是Co ...

  4. CSS书写规范、顺序

    写了这么久的CSS,但大部分前端er都没有按照良好的CSS书写规范来写CSS代码,这样会影响代码的阅读体验,总结一个CSS书写规范.CSS书写顺序供大家参考,这些是参考了国外一些文章以及我的个人经验总 ...

  5. Python常用模块的安装方法

    http://blog.163.com/yang_jianli/blog/static/161990006201162152724339/

  6. bzoj 4423 [AMPPZ2013]Bytehattan(对偶图,并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4423 [题意] 给定一个平面图,随时删边,并询问删边后两点是否连通.强制在线. [科普 ...

  7. Android版本判断

    尽管Android向下兼容不好,但是一个程序还是可以在多个平台上跑的.向下兼容不好,接口改变,新的平台上不能用旧的API,旧的平台更不可能用新的API,不等于一个平台需要一个APK.可以在高版本的SD ...

  8. 从Count看Oracle执行计划的选择

    一. 前言 在调查一个性能问题的时候,一个同事问道,为什么数据库有些时候这么不聪明,明明表上有索引,但是在执行一个简单的count的时候居然全表扫描了!难道不知道走索引更快么? 试图从最简单的coun ...

  9. 虚拟桌面基础架构(VDI)与终端服务和传统PC对比

    VDI(Virtual Desktop Infrastructure),即虚拟桌面基础架构,正迅速成为一个热门词汇,它将颠覆企业向终端用户交付应用的游戏规则.这篇专题就是想通过VDI与两种传统技术的对 ...

  10. redis.conf的配置

    daemonize yes   :  redis server 实例是否以后台方式运行 , no:不以后台方式运行(默认) , yes:以后台方式运行. requirepass 密码 :  密码最好长 ...