前言

一个偶然的机会接触到了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. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  2. SharePoint 2010遍历文档库中所有的文件,文件夹

    转:http://hi.baidu.com/sygwin/item/f99600849d51a12b110ef3eb 创建一个可视WebPart,并拖放一个label控件到ascx文件上,用于显示结果 ...

  3. 使用rsync同步Linux数据到Windows

    windows: win7,cwrsyncserver 4.1.0 linux:ubuntu 14.04,rsync 3.1.0 networks:使用360wifi [Windows端] 是否使用管 ...

  4. Oracle :一次数据库连接,返回多个结果集

    1. 一次数据库连接,返回多个结果集 1.1 建立包规范 create or replace package QX_GDJTJ is -- Author : xxx -- Created : 2012 ...

  5. Binary Tree Level Order Traversal java实现

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  6. codeforces 700B Connecting Universities 贪心dfs

    分析:这个题一眼看上去很难,但是正着做不行,我们换个角度:考虑每条边的贡献 因为是一棵树,所以一条边把树分成两个集合,假如左边有x个学校,右边有y个学校 贪心地想,让每条边在学校的路径上最多,所以贡献 ...

  7. 让Apache支持ASP.NET

    Apache是目前广泛使用的一种网络服务器程序,不仅在UNIX/LINUX平台上被大量使用,而且在Windows平台上也有许多站点放弃了IIS 而转向Apache..NET是微软推出的功能强大的开发技 ...

  8. D3D11_USAGE使用

    MSDN文档链接:http://msdn.microsoft.com/en-us/library/windows/desktop/ff476259(v=vs.85).aspx 不得不同吐槽一点的是,你 ...

  9. hadoop 权限错误 Permission denied: user=root, access=WRITE, inode="/":hdfs:super

    关于不能执行Hadoop命令 并报权限问题执行错误1.Permission denied: user=root, access=WRITE, inode="/":hdfs:supe ...

  10. C#选择排序详解

    选择排序图解                         选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的 ...