.NET中实现IOC有很多方式,比如:Unity、Ninject、Autofac、MEF
Ninject的实现参考《Pro ASP.NET MVC3.5 FrameWork》
下面给出的是Unity的实现,结合配置文件实现的IOC。
配置示例:
<?xml version="1.0"?>
<configuration>
    <configSections>
       
<section name="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
    </configSections>
    <unity>
        <typeAliases>
            <!--管理对象生命周期的三种方式-->
            <!--创建单例实例-->
           
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,
Microsoft.Practices.Unity" />
            <!--只可以保持对象的弱引用-->
           
<typeAlias alias="external"
type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,
Microsoft.Practices.Unity" />
            <!--在同一个线程返回同一个对象实例,不同线程对象实例不相同 -->
           
<typeAlias alias="perThread"
type="Microsoft.Practices.Unity.PerThreadLifetimeManager,
Microsoft.Practices.Unity" />
            
            <!--别名-->
           
<typeAlias alias="ICustomerInfo"
type="Yintai.ERP.Service.Customer.Interface.ICustomerInfo,Yintai.ERP.Service.Customer.Interface"
/>
            <typeAlias alias="CustomerInfo"
type="Yintai.ERP.Service.CustomerInfo.CustomerInfoService,Yintai.ERP.Service.CustomerInfo"
/>
        </typeAliases>
        <containers>
            <container name="ContainerService">
                <!--注册类型-->
                <register type="ICustomerInfo" mapTo="CustomerInfo">
                    <lifetime type="singleton"/>
                </register>
            </container>
        </containers>
    </unity>
</configuration>

C#代码:
private ICSWorkBusiness cSWorkBusiness=null;
/// <summary>
/// 构造函数
/// </summary>
public CSWorkService()
{
     cSWorkBusiness=ServiceBusContainer.Instance.Container.Resolve<ICSWorkBusiness>();
}

更多阅读资料:
微软企业库Unity学习笔记(一):http://www.cnblogs.com/rush/archive/2011/02/12/EntlibUnity.html
微软企业库Unity学习笔记(二):http://www.cnblogs.com/rush/archive/2011/04/16/Unity.html

补充2017-8-8:
InjectionConstructor --构造函数注入(多重载构造函数)
InjectionMethod --方法注入
Dependency --属性注入
Dependency(“name”) --给属性命名

项目中的代码结构:

指定类型:

配置映射关系:

应用层==》
定义IOC容器:

容器代码:
using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace Wede.ERP.Service.CRM
{

public sealed class CRMServiceContainer
    {
        private static CRMServiceContainer _instance;
        private string configFile = "";
        private string _ContainerName = "ContainerService";
        static readonly object lockobj = new object();
        private static IUnityContainer crmServiceUnityContainer;

/// <summary>
        /// 构造函数,得到Unit配置文件
        /// </summary>
        private CRMServiceContainer()
        {
            configFile = Wede.ERP.Config.BaseConfig.GetServiceCrmUnityConfigPath;
            if (string.IsNullOrEmpty(configFile))
            {
                throw new Exception(Wede.ERP.Config.BaseConfig.ErrorMessage);
            }
            else
            {
                configFile = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,configFile);
            }
        }

/// <summary>
        /// 单例方式实例化
        /// </summary>
        public static CRMServiceContainer Instance
        {
            get
            {
                lock (lockobj)
                {
                    if (_instance == null)
                    {
                        _instance = new CRMServiceContainer();
                    }
                    return _instance;
                }
            }
        }
        private object lockObj = new object();
        /// <summary>
        /// 初始化Unity的IoC容器对象
        /// </summary>
        public IUnityContainer Container
        {
            get
            {
                if (crmServiceUnityContainer == null)
                {
                    lock (lockObj)
                    {
                        crmServiceUnityContainer = new UnityContainer();
                        ExeConfigurationFileMap basicFileMap = new ExeConfigurationFileMap
                        {
                            ExeConfigFilename = configFile
                        };
                        UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager
                            .OpenMappedExeConfiguration(basicFileMap, ConfigurationUserLevel.None)
                            .GetSection("unity");
                        section.Configure(crmServiceUnityContainer, _ContainerName);
                    }
                }
                return crmServiceUnityContainer;
            }
        }
        public T Resolve<T>()
        {
            return Container.Resolve<T>();
        }
    }
}
应用层==》服务层应用:

IOC实现-Unity的更多相关文章

  1. .Net IOC 之Unity

    .Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...

  2. ASP.NET MVC IOC之Unity攻略

    ASP.NET MVC IOC之Unity攻略 一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先 ...

  3. IOC容器Unity的使用及独立配置文件Unity.Config

    [本段摘录自:IOC容器Unity 使用http://blog.csdn.net/gdjlc/article/details/8695266] 面向接口实现有很多好处,可以提供不同灵活的子类实现,增加 ...

  4. [IoC容器Unity]第四回:使用范例

    1.引言 前面几个章节介绍了Unity的基本使用,主要分为程序和配置文件两种方法的使用,可以参考一下链接, [IoC容器Unity]第一回:Unity预览 [IoC容器Unity]第二回:Lifeti ...

  5. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  6. 第十六回 IoC组件Unity续~批量动态为Unity添加类型和行为

    回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的 ...

  7. IoC组件Unity再续~根据类型字符串动态生产对象

    回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...

  8. IOC使用Unity 实现依赖注入

    转自:http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html http://www.cnblogs.com/xishuai ...

  9. [IoC容器Unity] :Unity预览

    1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...

  10. 控制反转-Ioc之Unity

    本篇幅主要介绍控制反转的一些概念,和如何使用Unity实现Ioc.在介绍的时候,会尽量结合代码来讲解一些概念. 1.什么是DI? DI即控制反转,是将对具体实现类的依赖转变为对接口的依赖,这样在编程中 ...

随机推荐

  1. android DownloadManager: java.lang.IllegalArgumentException: Not a file URI: content://

    DownloadManager 使用Uri指定下载路径Bug 使用DownloadManager 下载文件 通常写法: DownloadManager dm = (DownloadManager) g ...

  2. ES6展开运算符数组合并,函数传参

    定义: .展开运算符允许一个表达式在某处展开. 使用场景 1.展开函数在多个参数的地方使用 .意指用于函数传参 2.多个元素的地方使用,意指用于数组字面量 3.多个边框的地方使用,意指用于解构赋值 函 ...

  3. Spring Boot属性配置&自定义属性配置

    一.修改默认配置 例1.spring boot 开发web应用的时候,默认tomcat的启动端口为8080,如果需要修改默认的端口,则需要在application.properties 添加以下记录: ...

  4. Facebook libra开发者文档- 1 -welcome

    参考https://developers.libra.org/docs/welcome-to-libra 欢迎来到Libra开发者网站!Libra的使命是建立一个简单的全球货币和金融基础设施,为数十亿 ...

  5. 算法习题---4-2正方形(UVa201)

    一:题目 判断一个点阵中含有几个正方形(数正方形) 如图例中:有2个边长为1的正方形,1个边长为2的正方形 (一)题目详解 (二)样例输入 4 表示每行每列各有4个顶点 16 表示整个点阵中共有16条 ...

  6. java中把文件拷贝到指定目录下最简单几种方法

    java中把文件拷贝到指定目录下最简单几种方法   String savePath = "D:/file";// 文件保存到d盘的file目录下 File savefile = n ...

  7. MySQL的注入总结

    0x01 MySQL 5.0以上和MySQL 5.0以下版本的区别 MySQL5.0以上版本存在一个叫information_schema的数据库,它存储着数据库的所有信息,其中保存着关于MySQL服 ...

  8. Java 23中设计模式

    创建型模式(5): --单例模式.工厂模式.抽象工厂模式.建造者模式.原型模式. 结构型模式(7): --适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式. 行为模式(11): ...

  9. ROS学习(一)Ros 中使用kinect

    上的安装说明如下: 官网上明确写了如果安装windows kinect还需要安装一个驱动,但是有些ROS的书上并没有这么做,只提到了使用如下两步进行安装即可使用: sudo apt-get insta ...

  10. python3 爬虫利用Requests 实现下载进度条

    一.编写代码 from datetime import datetime,date,timedelta from contextlib import closing import urllib,url ...