原文地址:http://www.pnpguidance.net/Post/StructureMapTutorialDependencyInjectionIoCNET.aspx

StuctureMap 是一种.NET下的依赖注入框架,希望2.5版早点发布(目前最新是2.4.9)。这篇指南可以帮助您入门。

StructureMap依赖注入基础

在大多数ASP.NET WEB应用程序、智能客户端程序、WPF程序中,你都可以通过提供接口,创建可重用的服务。如:你定义一个接口叫ILogger,这个接口声明一组契约,为你的程序记录日志,并且你做了不同的、可重用的实现这个接口的类,如:类DatabaseLogger,把日志记录到数据库中。

当有一个对ILogger请求的时候,我们可以叫StructureMap注入返回一个DatabaseLogger的实例:

StructureMapConfiguration
    .ForRequestedType<ILogger>()
    .TheDefaultIsConcreteType<DatabaseLogger>()
    .CacheBy(InstanceScope.Singleton);

我们可以使用StructureMapConfiguration类创建一个Singleton模式的DatabaseLogger,也就是在整个应用程序中有且仅有一个实例的DatabaseLogger。

你可以使用StructureMap的ObjectFactory类取出这个ILogger的实例:

ILogger logger = ObjectFactory.GetInstance<ILogger>();

StructureMap会返回一个DatabaseLogger的实例,之前我们已经做好了DatabaseLogger对ILogger的映射。

然后把这些代码放到一个最简单的控制台应用程序中:

namespace StructureMapTutorials
{
    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 interface ICustomerDataSource { }

public class CustomerDataSource : ICustomerDataSource
{
    private readonly ILogger _logger;

public CustomerDataSource(ILogger logger)
    {
        _logger = logger;
    }
}

我们把ICustomerDataSource接口的具体实现CustomerDataSource类也注册到StructureMap中,就像刚才的ILogger服务一样:

StructureMapConfiguration
    .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类的构造方法中:

ICustomerDataSource dataSource =
    ObjectFactory.GetInstance<ICustomerDataSource>();

你可以通过下面的控制台程序看到StructureMap是怎样运行的:

using 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的类中注册。

Code
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 PluginFamilyPluggable特性

如果你愿意使用特性让StructureMap扫描不同的程序集并自动注册不同的类型到你的程序,你可以使用PluginFamily和Pluggable特性:

using StructureMap;
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中的依赖注入和控制反转相关推荐

  1. springboot的IOC依赖注入与控制反转-举例(转载+自己整理)

    这个记录是对[1]的整理和简化,便于日后遗忘时迅速恢复记忆. Spring框架有四大原则: ①使用POJO进行轻量级与最小侵入式开发 ②通过依赖注入和基于接口编程实现松耦合 ③通过AOP和默认习惯进行 ...

  2. 依赖注入框架Dagger2详解(一),依赖注入和控制反转的深入理解

    IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合.更优良的程序,而Dagger2框架是依赖注入思想践行者的优秀代表. 依赖注入框架Dagger2详解(一), ...

  3. 浅谈依赖注入与控制反转

    前言:设计模式其实是一个很空洞的东西,设计模式有几十种,有些人觉得工厂模式也单例模式已经足够解决大部分问题.而有些人觉得任何设计模式都会让开发变得更"复杂",更"低效&q ...

  4. Spring依赖注入和控制反转

    文章目录 1.依赖注入 1.1.依赖注入和控制反转的概念 1.2.依赖注入的实现方式 1.3.控制反转的具体实现 1.4.依赖注入的具体实现 1.5.依赖注入和控制反转总结 1.依赖注入 1.1.依赖 ...

  5. Spring的IOC(依赖注入和控制反转)

    Spring框架面试笔试必问之一!非常重要也非常强大,说实话一开始仿照着Spring MVC配置搭建起来,再写几句增删改查,真的配不上叫做学会了那个框架.框架是N种优秀的设计模式和一些很高深的技术组合 ...

  6. 简单解释什么是 依赖注入 和 控制反转

    简单解释什么是 依赖注入 和 控制反转 2017-07-09 关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该 ...

  7. 简单解释什么是 依赖注入 和 控制反转 1

    关于 依赖注入 与 控制反转 的概念有些人觉得很难理解,最近在给别人讲这个概念的时候梳理了一个比较好理解的解释,而且我认为非技术人员也应该能听的懂,因此分享给大家,希望下次你在给别人讲的时候也能讲的明 ...

  8. Spring的依赖注入和控制反转很难理解?一文搞定

    [用了这么久的Spring,一直没有理解好Spring的依赖注入和控制反转,以前看视频也没有老师讲清楚这个问题,今天终于刷到一个老师把这个问题讲清楚了,跪服大佬~~~] 孙哥说Spring5 全部更新 ...

  9. 依赖注入和控制反转的区别

    控制反转:创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理. 依赖注入:创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现. 依赖注入和控制反转是 ...

最新文章

  1. OVS搭建虚拟机全过程(四十五)
  2. VTK:绘制Arrow箭头用法实战
  3. SQL_Server_2008完全学习之第八章Transact-SQL编程
  4. 数据完整性(python 版)
  5. go语言strings包
  6. 求连续数组子序咧的最大和
  7. Visual studio2012密钥 vs2012密钥 本人亲测 真实有效
  8. 苹果系统连接服务器打印机,Mac系统怎么连接打印机
  9. 纯css改变checkbook样式
  10. oracle alter database,alter database操作
  11. 关于在li中使用阿里巴巴icon font导致文字不对齐的问题
  12. 80后的罗敏已经在创业路上走了十几年
  13. Texture Haven Spider
  14. 计算机学哪个编程好,达内机器人编程VS计算机编程,学哪个最好
  15. php/nginx重启命令
  16. 大青云不显示服务器,37大青云4月25日关服停止运营公告
  17. 百度联盟广告代码php,Javascript 实现广告后加载 可加载百度谷歌联盟广告[原创]_javascript技巧...
  18. 用FastAPI加爬虫制作一个涩图API,521就这样自己过。
  19. 年薪33-48万澳元起|澳门大学智慧城市物联网实验室招博后研究员
  20. 蜜罐如何获取攻击者敏感信息

热门文章

  1. 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)
  2. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.2 内部函数与操作
  3. python 去掉字符串的
  4. logrotate 不轮询
  5. Theano学习笔记(三)——图结构
  6. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
  7. 用纯JS做俄罗斯方块 - 简要思路介绍(1)
  8. Share Point 2013使用Windows PowerShell 获取,删除UserProFile
  9. CSDN并购博客园遐想
  10. 阿里巴巴5月5日综合算法题详解