[翻译]StructureMap 指南 – .NET中的依赖注入和控制反转
原文地址:http://www.pnpguidance.net/Post/StructureMapTutorialDependencyInjectionIoCNET.aspx
StuctureMap 是一种.NET下的依赖注入框架,希望2.5版早点发布(目前最新是2.4.9)。这篇指南可以帮助您入门。
StructureMap依赖注入基础
在大多数ASP.NET WEB应用程序、智能客户端程序、WPF程序中,你都可以通过提供接口,创建可重用的服务。如:你定义一个接口叫ILogger,这个接口声明一组契约,为你的程序记录日志,并且你做了不同的、可重用的实现这个接口的类,如:类DatabaseLogger,把日志记录到数据库中。
当有一个对ILogger请求的时候,我们可以叫StructureMap注入返回一个DatabaseLogger的实例:
.ForRequestedType<ILogger>()
.TheDefaultIsConcreteType<DatabaseLogger>()
.CacheBy(InstanceScope.Singleton);
我们可以使用StructureMapConfiguration类创建一个Singleton模式的DatabaseLogger,也就是在整个应用程序中有且仅有一个实例的DatabaseLogger。
你可以使用StructureMap的ObjectFactory类取出这个ILogger的实例:
StructureMap会返回一个DatabaseLogger的实例,之前我们已经做好了DatabaseLogger对ILogger的映射。
然后把这些代码放到一个最简单的控制台应用程序中:
{
class Program
{
static void Main(string[] args)
{
StructureMapConfiguration
.ForRequestedType<ILogger>()
.TheDefaultIsConcreteType<DatabaseLogger>()
.CacheBy(InstanceScope.Singleton);
ILogger logger = ObjectFactory.GetInstance<ILogger>();
}
}
public interface ILogger {}
public class DatabaseLogger : ILogger {}
}
更精彩的是: StructureMap会自动在对象中注入所依赖的对象实例。比如我们的程序里还有个CustomerDataSource类,也需要ILogger服务:
public class CustomerDataSource : ICustomerDataSource
{
private readonly ILogger _logger;
public CustomerDataSource(ILogger logger)
{
_logger = logger;
}
}
我们把ICustomerDataSource接口的具体实现CustomerDataSource类也注册到StructureMap中,就像刚才的ILogger服务一样:
.ForRequestedType<ICustomerDataSource>()
.TheDefaultIsConcreteType<CustomerDataSource>()
.CacheBy(InstanceScope.Singleton);
and then we can ask for an instance of ICustomerDataSource from StructureMap's ObjectFactory Class, which automatically injects the propery ILogger Service into the CustomerDataSource Class' Constructor for us:
然后,我们向StructureMap的ObjectFactory类请求一个ICustomerDataSource的实例,它会自动把ILogger属性注入服务到CustomerDataSource类的构造方法中:
ObjectFactory.GetInstance<ICustomerDataSource>();
你可以通过下面的控制台程序看到StructureMap是怎样运行的:
using StructureMap.Attributes;
namespace StructureMapTutorials
{
class Program
{
static void Main(string[] args)
{
StructureMapConfiguration
.ForRequestedType<ILogger>()
.TheDefaultIsConcreteType<DatabaseLogger>()
.CacheBy(InstanceScope.Singleton);
StructureMapConfiguration
.ForRequestedType<ICustomerDataSource>()
.TheDefaultIsConcreteType<CustomerDataSource>()
.CacheBy(InstanceScope.Singleton);
ICustomerDataSource dataSource =
ObjectFactory.GetInstance<ICustomerDataSource>();
}
}
public interface ILogger { }
public class DatabaseLogger : ILogger { }
public interface ICustomerDataSource { }
public class CustomerDataSource : ICustomerDataSource
{
private readonly ILogger _logger;
public CustomerDataSource(ILogger logger)
{
_logger = logger;
}
}
}
StructureMap注册表
通常依赖注入和控制反转工具都有以组关系注册的方式。StructureMap有”注册表”的概念。我们可以改变上面的代码,把ILogger和ICustomerDataSource放到一组叫ServiceRegistry的类中注册。
using StructureMap;
using StructureMap.Attributes;
using StructureMap.Configuration.DSL;
namespace StructureMapTutorials
{
class Program
{
static void Main(string[] args)
{
StructureMapConfiguration
.AddRegistry(new ServiceRegistry());
ICustomerDataSource dataSource =
ObjectFactory.GetInstance<ICustomerDataSource>();
}
}
public class ServiceRegistry : Registry
{
protected override void configure()
{
ForRequestedType<ILogger>()
.TheDefaultIsConcreteType<DatabaseLogger>()
.CacheBy(InstanceScope.Singleton);
ForRequestedType<ICustomerDataSource>()
.TheDefaultIsConcreteType<CustomerDataSource>()
.CacheBy(InstanceScope.Singleton);
}
}
public interface ILogger { }
public class DatabaseLogger : ILogger { }
public interface ICustomerDataSource { }
public class CustomerDataSource : ICustomerDataSource
{
private readonly ILogger _logger;
public CustomerDataSource(ILogger logger)
{
_logger = logger;
}
}
}
StructureMap PluginFamily和Pluggable特性
如果你愿意使用特性让StructureMap扫描不同的程序集并自动注册不同的类型到你的程序,你可以使用PluginFamily和Pluggable特性:
using StructureMap.Attributes;
using StructureMap.Configuration.DSL;
namespace StructureMapTutorials
{
class Program
{
static void Main(string[] args)
{
StructureMapConfiguration
.ScanAssemblies()
.IncludeTheCallingAssembly();
ICustomerDataSource dataSource =
ObjectFactory.GetInstance<ICustomerDataSource>();
}
}
[PluginFamily("Database", IsSingleton = true)]
public interface ILogger { }
[Pluggable("Database")]
public class DatabaseLogger : ILogger { }
[PluginFamily("CustomerDataSource", IsSingleton = true)]
public interface ICustomerDataSource { }
[Pluggable("CustomerDataSource")]
public class CustomerDataSource : ICustomerDataSource
{
private readonly ILogger _logger;
public CustomerDataSource(ILogger logger)
{
_logger = logger;
}
}
}
结语
这篇文章介绍了些在.NET中使用StructureMap框架依赖注入和控制反转的基础知识。
你也可以试试这些工具:Autofac, Castle Windsor, Ninject, SpringFramework.net, Unity。
希望对您有所帮助,David Hayden。
转载于:https://www.cnblogs.com/darkdawn/archive/2008/09/04/1284018.html
[翻译]StructureMap 指南 – .NET中的依赖注入和控制反转相关推荐
- springboot的IOC依赖注入与控制反转-举例(转载+自己整理)
这个记录是对[1]的整理和简化,便于日后遗忘时迅速恢复记忆. Spring框架有四大原则: ①使用POJO进行轻量级与最小侵入式开发 ②通过依赖注入和基于接口编程实现松耦合 ③通过AOP和默认习惯进行 ...
- 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解
IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...
- 浅谈依赖注入与控制反转
前言:设计模式其实是一个很空洞的东西,设计模式有几十种,有些人觉得工厂模式也单例模式已经足够解决大部分问题.而有些人觉得任何设计模式都会让开发变得更"复杂",更"低效&q ...
- Spring依赖注入和控制反转
文章目录 1.依赖注入 1.1.依赖注入和控制反转的概念 1.2.依赖注入的实现方式 1.3.控制反转的具体实现 1.4.依赖注入的具体实现 1.5.依赖注入和控制反转总结 1.依赖注入 1.1.依赖 ...
- Spring的IOC(依赖注入和控制反转)
Spring框架面试笔试必问之一!非常重要也非常强大,说实话一开始仿照着Spring MVC配置搭建起来,再写几句增删改查,真的配不上叫做学会了那个框架.框架是N种优秀的设计模式和一些很高深的技术组合 ...
- 简单解释什么是 依赖注入 和 控制反转
简单解释什么是 依赖注入 和 控制反转 2017-07-09 关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该 ...
- 简单解释什么是 依赖注入 和 控制反转 1
关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该能听的懂,因此分享给大家,希望下次你在给别人讲的时候也能讲的明 ...
- Spring的依赖注入和控制反转很难理解?一文搞定
[用了这么久的Spring,一直没有理解好Spring的依赖注入和控制反转,以前看视频也没有老师讲清楚这个问题,今天终于刷到一个老师把这个问题讲清楚了,跪服大佬~~~] 孙哥说Spring5 全部更新 ...
- 依赖注入和控制反转的区别
控制反转:创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理. 依赖注入:创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现. 依赖注入和控制反转是 ...
最新文章
- OVS搭建虚拟机全过程(四十五)
- VTK:绘制Arrow箭头用法实战
- SQL_Server_2008完全学习之第八章Transact-SQL编程
- 数据完整性(python 版)
- go语言strings包
- 求连续数组子序咧的最大和
- Visual studio2012密钥 vs2012密钥 本人亲测 真实有效
- 苹果系统连接服务器打印机,Mac系统怎么连接打印机
- 纯css改变checkbook样式
- oracle alter database,alter database操作
- 关于在li中使用阿里巴巴icon font导致文字不对齐的问题
- 80后的罗敏已经在创业路上走了十几年
- Texture Haven Spider
- 计算机学哪个编程好,达内机器人编程VS计算机编程,学哪个最好
- php/nginx重启命令
- 大青云不显示服务器,37大青云4月25日关服停止运营公告
- 百度联盟广告代码php,Javascript 实现广告后加载 可加载百度谷歌联盟广告[原创]_javascript技巧...
- 用FastAPI加爬虫制作一个涩图API,521就这样自己过。
- 年薪33-48万澳元起|澳门大学智慧城市物联网实验室招博后研究员
- 蜜罐如何获取攻击者敏感信息
热门文章
- 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)
- 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.2 内部函数与操作
- python 去掉字符串的
- logrotate 不轮询
- Theano学习笔记(三)——图结构
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
- 用纯JS做俄罗斯方块 - 简要思路介绍(1)
- Share Point 2013使用Windows PowerShell 获取,删除UserProFile
- CSDN并购博客园遐想
- 阿里巴巴5月5日综合算法题详解