c# ioc 单例模式_C# IOC 控制反转
说明:需要引用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 控制反转相关推荐
- IoC(Inversion of Control,控制反转)模式
IoC模式 1.依赖依赖就是有联系,有地方使用到它就是有依赖它,一个系统不可能完全避免依赖.如果你的一个类或者模块在项目中没有用到它,恭喜你,可以从项目中剔除它或者排除它了,因为没有一个地方会依赖它. ...
- springboot的IOC依赖注入与控制反转-举例(转载+自己整理)
这个记录是对[1]的整理和简化,便于日后遗忘时迅速恢复记忆. Spring框架有四大原则: ①使用POJO进行轻量级与最小侵入式开发 ②通过依赖注入和基于接口编程实现松耦合 ③通过AOP和默认习惯进行 ...
- Spring IOC(Inversion Of Controll 控制反转)
IOC是什么? 对象之间的依赖关系由容器来建立. DI(Dependency Injection 依赖注入)是什么? 容器通过调用对象提供的set方法或者构造器来建立依赖关系. 注:IOC是目标,DI ...
- 庖丁解牛Nop:控制反转--IOC和DI
IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection); 使用控制反转开发模式是先开发接口,然后再实现类.这种方法却可以 ...
- Spring_01 spring容器、控制反转(IOC)、依赖注入(DI)
目录 1 什么是spring框架 2 spring框架的特点 3 spring容器 3.1 什么是spring容器 3.2 spring容器创建对象的编程步骤 3.4 spring容器创建对象的方式 ...
- java-12:spring MVC - 控制反转IOC,依赖注入DI
学习spring框架之前,先理解几个概念: 1.第一部分:依赖倒置原则 2.第二部分:控制反转,控制反转容器(实例) 3.第三部分:控制反转,控制反转容器(全面理解,面试题) 综合性理解:控制反转(I ...
- 浅析Spring——控制反转IoC
目录 1. IoC理论推导 2. 什么是IoC? 3. 引入DI 4. IoC容器 5. 注入对象的四种方法 1.基于接口 2.基于setter 3.基于构造函数 4.基于注解 6. 两种IoC实现方 ...
- 简述控制反转ioc_深度理解Spring IOC(控制反转)
一.IOC概述 Inverse Of Controll即为控制反转,简称IOC . 简单来说,IOC反转了依赖关系的满足方式,由之前的自己创建依赖对象,变为由工厂推送.(变主动为被动,即反转)它解决了 ...
- python ioc di_PHP的依赖注入(DI) 和 控制反转(IoC)
要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题:DI -- Dependency Injection 依赖注入 IoC -- Inversion of Control ...
最新文章
- Interesting Finds: 2008.03.17
- IDEA 代码生成插件 CodeMaker
- python中的__name__=='__main__'如何简单理解(一)
- 什么是python语言的动态类型机制_理解Python的Dynamic typing
- 【HDU - 1045】Fire Net (dfs 或二分图)
- 2020年深度学习调参技巧合集
- 花了 4 天,破解 UNIX 联合创始人 39 年前的密码!
- 西部数据中断与华为合作;苹果首次参加天猫 618;罗永浩第三次出质锤子股权 | 极客头条...
- obspy中文教程(六)
- excel常用功能记录(不断更新)
- 用ESP32打造一个物联网红外测温打卡机/春节结束急着上班?哒咩,再努力奋斗也要先测体温
- QTableView实现冻结行冻结列
- 初学者零基础如何快速入门学习平面设计
- Git问题Everything up-to-date正确解决方法
- 可实现一种个人微信二维码收款接口的方法
- command not found: conda
- 今日头条---后台开发笔试题
- [web效果实现-3] 拼音排序通讯录实现
- linux下内存分配原因导致的Load过高
- linux做视频 加字幕,ubuntu16.04给视频添加字幕方法 ubuntu16.04如何给视频添加字幕...
热门文章
- java私聊_【转帖】实现了视频私聊功能
- cartographer运行没有map_提高代码运行效率——Map的妙用
- c语言 怎么访问64位地址_大神用10000字总结了嵌入式C语言必学知识点……
- 南京大学杨杨计算机,国际交流,研途有术 | 博士生国际学术交流经验分享会(四)...
- 学习总结——工作中的性能测试完整过程
- 21天Jmeter打卡Day18 前置处理器_熟悉常用组件
- python modbus tk 库_python modbus_tk模块学习笔记(rtu slaver例程)
- mfc mysql delete_MFC中简单的数据库文件操作(添加,修改,查找,删除)
- java 字符串加密解密_Java加密解密字符串
- mysql同步到另一台服务器_mysql数据库从一台服务器迁移到另一台服务器上