IOC实现-Unity

.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>();
        }
    }
}
应用层==》服务层应用:

原文地址:https://www.cnblogs.com/zhaow/p/9754515.html

时间: 2024-11-09 00:47:35

IOC实现-Unity的相关文章

ASP.NET MVC IOC之Unity攻略

一.你知道IOC与DI吗? 1.IOC(Inversion of Control )——控制反转 即依赖对象不在被依赖模块的类中直接通过new来获取 先看看下面这段代码的问题~ public class SqlServerDal { public void Delete() { Console.WriteLine("删除表中某个订单信息!"); } } public class Order { private readonly SqlServerDal dal = new SqlSer

C# Ioc容器Unity,简单实用

原文:C# Ioc容器Unity,简单实用 开头先吐槽一下博客园超级不好用,添加图片后就写不动字了,难道是bug 好进入正题,先来说下依赖注入,简单来说就是定义好接口,上层代码调用接口,具体实现通过配置文件方式去指定具体实现类. 首先我们需要通过nuget来安装unity 安装好后就可以写一个方法类去实现依赖注入 public class UnityIocHelper : IServiceProvider { private readonly IUnityContainer _container

IoC之Unity实现

public static class Bootstrapper { private static ILog logger = LogManager.GetLogger(typeof(Bootstrapper)); static Bootstrapper() { try { logger.Info("start load container"); Container.InitializeWith(new DependencyResolverFactory()); } catch (Ex

依赖反转Ioc和unity,autofac,castle框架教程及比较

1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 http://www.cnblogs.com/muzinian/p/3357741.html 于依赖反转原则.控制反转和依赖注入的抽象的初学者指南 3.主流ioc框架 http://www.cnblogs.com/bchp/articles/1527693.html http://www.cnbl

IoC之Unity

一.什么是IcC? IoC(Inversion of Control,控制反转)又称“依赖注入”(Dependence Injection,DI). 控制反转就是创建对象的权利由开发人员控制,转为由容器来控制. 依赖注入就是通过容器创建对象的,是通过在构造方法的参数,属性设置和接口等方式注入的. IoC的基本概念是:不创建对象,但是描述创建它们的方式.在代码中不直接与对象和服务连接,但在配置文件(或程序)中描述创建关系,容器负责将它们联系起来. 二.什么是Unity? Unity是微软开发的一款

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

回到目录 之前的一篇Unity的文章主要是基本的实现,并没有什么特别的地方,使用Unity可以方便的实现应用程序的IoC控制反转,这给我们的应用程序在耦合度上变得高了,同时可测试性加强了,当然,这些的前提都是面向接口编程,如果你面向了具体实现去写程序,那你不用再看本篇文章了,呵呵. 本文章主要分享一下,通过Unity组件里的服务定位器ServiceLocator来实现批量加载类型,即你不用那它们一个个的配置到config文件里了,甚至在进行动态加载时,同时可以为它添加一些行为,如缓存,呵呵 !

IOC使用Unity 实现依赖注入

转自:http://www.cnblogs.com/techborther/archive/2012/01/06/2313498.html http://www.cnblogs.com/xishuai/p/3728576.html http://www.cnblogs.com/artech/archive/2011/09/15/UnityDemo.html http://www.cnblogs.com/legendxian/archive/2010/01/08/1641366.html Asp.

[IoC容器Unity]第三回:依赖注入

上节介绍了,Unity的Lifetime Managers生命周期,Unity具体实现依赖注入包含构造函数注入.属性注入.方法注入,所谓注入相当赋值,下面一个一个来介绍. 2.构造函数注入 Unity利用Resolve方法解析一个对象,都是调用注册类型的构造函数来初始化的,初始化时,Unity能够控制初始化的值,当然,我们要给Unity提供足够的原料,要不然也是巧妇难无米之炊,下面看一些简单的示例. 先准备几个类如下: /// <summary> /// 班级接口 /// </summa

理解依赖注入(IOC)和学习Unity

IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口.当系统重构的时候,代码的改写量将大大减少. 理解依赖注入: 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常有调用者来创建被调用者的实例.然而采用依赖注入的方式,创建被调用者的工作不再由调用者来完成,因此叫控制反转,创建被调用者的实例的工作由IOC容器