说明:需要引用using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.Configuration; 两个企业库,using System.IO;using System.Configuration;以及接口和类的dll (IDAL.dll,DAL.dll)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.Practices.Unity;

using Microsoft.Practices.Unity.Configuration;

using System.IO;

using System.Configuration;

namespace ObjectFactory

{

public sealed class ObjectFactory

{

private static readonly object containerLock = new object();

private static Dictionary Containers = new Dictionary();

public static IObject CreateObject()

{

IUnityContainer container = null;

lock (containerLock)

{

Type type = typeof(IObject);

string name = type.Assembly.GetName().Name;

string configName = (Path.GetDirectoryName(type.Assembly.CodeBase) + @"\" + name + ".config").Substring(6);

if (Containers.ContainsKey(name))

{

container = Containers[name];

}

else

{

container = LoadContainer(configName);

if (container != null)

{

Containers.Add(name, container);

}

}

}

if (container != null)

{

return Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(container, new ResolverOverride[0]);

}

return default(IObject);

}

public static IObject CreateObject(string strFilePath)

{

IUnityContainer container = null;

IObject entity=default(IObject);

lock (containerLock)

{

Type type = typeof(IObject);

string name = type.Assembly.GetName().Name;

Path.GetDirectoryName(type.Assembly.CodeBase);

string configName = strFilePath;

if (Containers.ContainsKey(name))

{

container = Containers[name];

}

else

{

container = LoadContainer(configName);

if (container != null)

{

Containers.Add(name, container);

}

}

}

if (container != null)

{

entity= Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(container, new ResolverOverride[0]);

return entity;

}

return entity

}

public static object CreateObject(Type interfaceType)

{

IUnityContainer container = null;

lock (containerLock)

{

string name = interfaceType.Assembly.GetName().Name;

string configName = (Path.GetDirectoryName(interfaceType.Assembly.CodeBase) + @"\" + name + ".config").Substring(6);

if (Containers.ContainsKey(name))

{

container = Containers[name];

}

else

{

container = LoadContainer(configName);

if (container != null)

{

Containers.Add(name, container);

}

}

}

if (container != null)

{

return  Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(container, interfaceType, new ResolverOverride[0]);

}

return null;

}

private static IUnityContainer LoadContainer(string configName)

{

IUnityContainer container = new UnityContainer();

ConfigurationFileMap map2 = new ConfigurationFileMap();

map2.MachineConfigFilename = configName;

ConfigurationFileMap fileMap = map2;

UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.OpenMappedMachineConfiguration(fileMap).GetSection("unity");

if (section != null)

{

container= Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container, section);

return container;

}

return null;

}

}

}

以下是配制文件:

type="Microsoft.Practices.Unity.TransientLifetimeManager,Microsoft.Practices.Unity"/>

type="Microsoft.Practices.Unity.PerThreadLifetimeManager,Microsoft.Practices.Unity"/>

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Microsoft.Practices.Unity;

using Microsoft.Practices.Unity.Configuration;

using System.IO;

using System.Configuration;

namespace IOC

{

///

/// IOC容器类(需要引用接口和类的dll)

///

public sealed class Factory

{

//单例模式

public static readonly object singletonObj = new object(); //用于锁(在多线程时锁住一个线程,排斥其它线程以保证实例唯一)

public static Dictionary Containers = new Dictionary();

public static IObject CreateObject()

{

IUnityContainer container = null;

//default 用于泛型参数初始值,引用类型默认是null,值类型是0.

IObject entity = default(IObject);

lock (singletonObj)

{

Type type = typeof(IObject);

//接口名称

string interfaceName = type.Assembly.GetName().Name;

//获取接口的完整路径

string dllFullPath = type.Assembly.CodeBase;

//获取配制文件的位置

string configNamePth = (Path.GetDirectoryName(dllFullPath) + @"\" + interfaceName + ".config").Substring(6);

//创建区域容器实例

container = LoadUnityContainer(configNamePth);

if (!Containers.ContainsKey(interfaceName))

{

Containers.Add(interfaceName, container);

}

else

{

container = Containers[interfaceName];

}

}

if (container != null)

{

entity = Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(container, new ResolverOverride[0]);

}

return entity;

}

///

/// 创建区域容器实例

///

/// 配制文件绝对路径

///

public static IUnityContainer LoadUnityContainer(string configNamePath)

{

IUnityContainer container = new UnityContainer();

//指定映射配制文件

ConfigurationFileMap map = new ConfigurationFileMap();

map.MachineConfigFilename = configNamePath;

//打开指定的映射配制文件

UnityConfigurationSection section = ConfigurationManager.OpenMappedMachineConfiguration(map).GetSection("unity") as UnityConfigurationSection;

if (section != null)

{

container = Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(container, section);

return container;

}

return null;

}

}

}

c# ioc 单例模式_C# IOC 控制反转相关推荐

  1. IoC(Inversion of Control,控制反转)模式

    IoC模式 1.依赖依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它. ...

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

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

  3. Spring IOC(Inversion Of Controll 控制反转)

    IOC是什么? 对象之间的依赖关系由容器来建立. DI(Dependency Injection 依赖注入)是什么? 容器通过调用对象提供的set方法或者构造器来建立依赖关系. 注:IOC是目标,DI ...

  4. 庖丁解牛Nop:控制反转--IOC和DI

    IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection); 使用控制反转开发模式是先开发接口,然后再实现类.这种方法却可以 ...

  5. Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)

    目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...

  6. java-12:spring MVC - 控制反转IOC,依赖注入DI

    学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...

  7. 浅析Spring——控制反转IoC

    目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...

  8. 简述控制反转ioc_深度理解Spring IOC(控制反转)

    一.IOC概述 Inverse Of Controll即为控制反转,简称IOC . 简单来说,IOC反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送.(变主动为被动,即反转)它解决了 ...

  9. python ioc di_PHP的依赖注入(DI) 和 控制反转(IoC)

    要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题:DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control ...

最新文章

  1. Interesting Finds: 2008.03.17
  2. IDEA 代码生成插件 CodeMaker
  3. python中的__name__=='__main__'如何简单理解(一)
  4. 什么是python语言的动态类型机制_理解Python的Dynamic typing
  5. 【HDU - 1045】Fire Net (dfs 或二分图)
  6. 2020年深度学习调参技巧合集
  7. 花了 4 天,破解 UNIX 联合创始人 39 年前的密码!
  8. 西部数据中断与华为合作;苹果首次参加天猫 618;罗永浩第三次出质锤子股权 | 极客头条...
  9. obspy中文教程(六)
  10. excel常用功能记录(不断更新)
  11. 用ESP32打造一个物联网红外测温打卡机/春节结束急着上班?哒咩,再努力奋斗也要先测体温
  12. QTableView实现冻结行冻结列
  13. 初学者零基础如何快速入门学习平面设计
  14. Git问题Everything up-to-date正确解决方法
  15. 可实现一种个人微信二维码收款接口的方法
  16. command not found: conda
  17. 今日头条---后台开发笔试题
  18. [web效果实现-3] 拼音排序通讯录实现
  19. linux下内存分配原因导致的Load过高
  20. linux做视频 加字幕,ubuntu16.04给视频添加字幕方法 ubuntu16.04如何给视频添加字幕...

热门文章

  1. java私聊_【转帖】实现了视频私聊功能
  2. cartographer运行没有map_提高代码运行效率——Map的妙用
  3. c语言 怎么访问64位地址_大神用10000字总结了嵌入式C语言必学知识点……
  4. 南京大学杨杨计算机,国际交流,研途有术 | 博士生国际学术交流经验分享会(四)...
  5. 学习总结——工作中的性能测试完整过程
  6. 21天Jmeter打卡Day18 前置处理器_熟悉常用组件
  7. python modbus tk 库_python modbus_tk模块学习笔记(rtu slaver例程)
  8. mfc mysql delete_MFC中简单的数据库文件操作(添加,修改,查找,删除)
  9. java 字符串加密解密_Java加密解密字符串
  10. mysql同步到另一台服务器_mysql数据库从一台服务器迁移到另一台服务器上