首先要在项目中安装Unity,通过NuGet搜索Unity。

1.定义接口 IDependencyResolver

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace IOCContainer
{public interface IDependencyResolver : IDisposable{/// <summary>/// 注册 T类型实例/// </summary>/// <typeparam name="T"></typeparam>/// <param name="instance"></param>void Register<T>(T instance);/// <summary>/// 注入 /// </summary>/// <typeparam name="T"></typeparam>/// <param name="existing"></param>void Inject<T>(T existing);/// <summary>/// 解析/// </summary>/// <typeparam name="T"></typeparam>/// <param name="type"></param>/// <returns></returns>T Resolve<T>(Type type);T Resolve<T>(Type type, string name);T Resolve<T>();T Resolve<T>(string name);IEnumerable<T> ResolveAll<T>();}
}

  

2.具体实现接口 UnityDependencyResolver

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace IOCContainer
{[Serializable]public class UnityDependencyResolver : IDisposable, IDependencyResolver{//注入容器private IUnityContainer _container;public UnityDependencyResolver() : this(new UnityContainer()){UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");_container.LoadConfiguration(configuration, "UnityContainer");}public UnityDependencyResolver(IUnityContainer container){_container = container;}public void Register<T>(T instance){//注册实例_container.RegisterInstance(instance);}public void Inject<T>(T existing){//注入加载_container.BuildUp(existing);}public T Resolve<T>(Type type){//解析return (T)_container.Resolve(type);}public T Resolve<T>(Type type, string name){return (T)_container.Resolve(type, name);}public T Resolve<T>(){return _container.Resolve<T>();}public T Resolve<T>(string name){return _container.Resolve<T>(name);}public IEnumerable<T> ResolveAll<T>(){//解析容器中所有IEnumerable<T> namedInstances = _container.ResolveAll<T>();T unnamedInstance = default(T);try{unnamedInstance = _container.Resolve<T>();}catch (ResolutionFailedException){//When default instance is missing}if (Equals(unnamedInstance, default(T))){return namedInstances;}return new ReadOnlyCollection<T>(new List<T>(namedInstances) { unnamedInstance });}public void Dispose(){if (_container != null){_container.Dispose();}}}
}

  

3.定义工厂接口 IDependencyResolverFactory

using IOCContainer;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace IOCContainer
{public interface IDependencyResolverFactory{/// <summary>/// 创建IDependencyResolver的实例/// </summary>/// <returns></returns>IDependencyResolver CreateInstance();}
}

  

4.具体实现工厂接口 DependencyResolverFactory

using IOCContainer;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace IOCContainer
{public class DependencyResolverFactory : IDependencyResolverFactory{private Type _resolverType;public DependencyResolverFactory(string resolverTypeName){_resolverType = Type.GetType(resolverTypeName, true, true);}public DependencyResolverFactory(){_resolverType = Type.GetType(ConfigurationManager.AppSettings["DependencyResolverTypeName"], true, true);}public IDependencyResolver CreateInstance(){//根据类型创建实例对象return Activator.CreateInstance(_resolverType) as IDependencyResolver;}}
}

  

5.调用工厂封装 IoC

using IOCContainer;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace IOCContainer
{public static class IoC{//解析器private static IDependencyResolver _resolver;/// <summary>/// 初始化,创建实例对象/// </summary>/// <param name="factory"></param>[DebuggerStepThrough]public static void InitializeWith(IDependencyResolverFactory factory){_resolver = factory.CreateInstance();}/// <summary>/// 注册对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="instance"></param>[DebuggerStepThrough]public static void Register<T>(T instance){_resolver.Register(instance);}/// <summary>/// 注入对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="existing"></param>[DebuggerStepThrough]public static void Inject<T>(T existing){_resolver.Inject(existing);}/// <summary>/// 解析对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="type"></param>/// <returns></returns>[DebuggerStepThrough]public static T Resolve<T>(Type type){return _resolver.Resolve<T>(type);}/// <summary>/// 解析对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="type"></param>/// <param name="name"></param>/// <returns></returns>[DebuggerStepThrough]public static T Resolve<T>(Type type, string name){return _resolver.Resolve<T>(type, name);}/// <summary>/// 解析对象/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>[DebuggerStepThrough]public static T Resolve<T>(){return _resolver.Resolve<T>();}/// <summary>/// 解析对象/// </summary>/// <typeparam name="T"></typeparam>/// <param name="name"></param>/// <returns></returns>[DebuggerStepThrough]public static T Resolve<T>(string name){return _resolver.Resolve<T>(name);}/// <summary>/// 解析对象/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>[DebuggerStepThrough]public static IEnumerable<T> ResolveAll<T>(){return _resolver.ResolveAll<T>();}/// <summary>/// 销毁/// </summary>[DebuggerStepThrough]public static void Reset(){if (_resolver != null){_resolver.Dispose();}}}
}

6.配置文件

<configuration><configSections><!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --><section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /><!--声明容器--><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/></configSections><unity><!--定义类型别名--><aliases><add alias="IProduct" type="UnityTest.IProduct,UnityTest" /><add alias="Milk" type="UnityTest.Milk,UnityTest" /><add alias="Sugar" type="UnityTest.Sugar,UnityTest" /></aliases><!--容器--><container name="UnityContainer"><!--映射关系--><register type="IProduct"  mapTo="Milk"  name="Milk"></register><register type="IProduct"  mapTo="Sugar" name="Sugar"></register></container></unity><connectionStrings><add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-UnityTest-20160816022913.mdf;Initial Catalog=aspnet-UnityTest-20160816022913;Integrated Security=True" providerName="System.Data.SqlClient" /></connectionStrings><appSettings><add key="webpages:Version" value="3.0.0.0" /><add key="webpages:Enabled" value="false" /><add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /><!--Unity IOC容器--><add key="DependencyResolverTypeName" value="IOCContainer.UnityDependencyResolver,IOCContainer"/></appSettings><!--省略了其他配置...-->
</configuration>

  

7.具体实体类

/// <summary>/// 商品/// </summary>public interface IProduct{string ClassName { get; set; }string ShowInfo();}/// <summary>/// 牛奶/// </summary>public class Milk : IProduct{public string ClassName { get; set; }public string ShowInfo(){return "牛奶";}}/// <summary>/// 糖/// </summary>public class Sugar : IProduct{public string ClassName { get; set; }public string ShowInfo(){return "糖";}}

8.使用Ioc得到对象

       //初始化 指定注册器IoC.InitializeWith(new DependencyResolverFactory("IOCContainer.UnityDependencyResolver"));//初始化 使用默认注册器,配置文件中配置,IOCContainer.UnityDependencyResolver 的无参构造函数//IoC.InitializeWith(new DependencyResolverFactory());//得到实例IProduct sugar = IoC.Resolve<IProduct>("Sugar");string result = sugar.ShowInfo();Response.Write(result);

  来源:http://www.cnblogs.com/qqlin/archive/2012/10/18/2720830.html

转载于:https://www.cnblogs.com/xsj1989/p/5845927.html

Unity(四)IocContainer 封装类库相关推荐

  1. Unity UnityWebRequest 下载封装

    Unity UnityWebRequest 下载封装 对unity原生的UnityWebRequest 进行二次封装 public void UnityWebRequestLoad<T>( ...

  2. C#教程之自己动手写映射第四节[封装删除]

    一.动机 我们在借助于SqlHelper删除数据的时候,一般的代码如下: 1 /* 2 * 3 * 创建人:李林峰 4 * 5 * 时 间:2012-07-26 6 * 7 * 描 述:借助于SqlH ...

  3. python接口自动化(三十四)-封装与调用--函数和参数化(详解)

    简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...

  4. 【开源项目12】Retrofit – Java(Android) 的REST 接口封装类库

    Retrofit官网:http://square.github.io/retrofit/ Retrofit   和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofi ...

  5. Unity调用Android封装的声网sdk

    文章目录 unity3调用Android 封装的声网SDK 1.环境版本 2.创建Android library 工程 3.unity3D 依赖包添加到工程libs下 4.UnityPlayerAct ...

  6. php 如何封装类库,ThinkPHP里的import方法用于类库导入的封装实现实例详解

    ThinkPHP里的import方法用于类库导入的封装实现实例详解 分类:PHP_Python| 发布:佚名| 查看: | 发表时间:2014/7/1 import方法是ThinkPHP框架用于类库导 ...

  7. Unity(四):使用场景Ⅰ:建立类型映射

    在之前的一篇文章"Unity(三):快速入门"中,给出了一个简单的示例,让我们对Unity有一个感性的认识.但是,Unity到底是做什么用的呢?一个简单示例并不能解答这个问题. 总 ...

  8. 从零开始完成Yolov5目标识别(四)封装一个跨设备的YOLOv5检测软件

    往期文章 从零开始完成YOLOv5目标识别(三)用PyQt5展示YOLOv5的识别结果​​​​​从零开始完成Yolov5目标识别(二)制作并训练自己的训练集 ​​​​​​从零开始完成Yolov5目标识 ...

  9. 抢票软件开发(四) 软件封装

    封装软件是采用的是config.ini配置文件与pyinstaller进行结合的方式, 1.config文件中主要配置的是网站链接等信息,供用户根据需要进行调整 2.pyinstaller是将软件封装 ...

最新文章

  1. 猴子用意念玩游戏,马斯克脑机接口公司新进展
  2. CentOS安装Mysql8
  3. Python提示错误 module 'request' has no attribute 'urlretrieve'
  4. 业界:绿盟发布基于攻击链的威胁感知系统
  5. 【文摘】《创新者》-沃尔特·艾萨克森
  6. 软件界旷世之架:测试驱动开发(TDD)之争
  7. 大学生河南旅游网页设计成品 学生网页作业我的家乡网页制作代码 静态HTML旅游网页设计作品下载
  8. 微信机器人 DIY 从 0 到 1
  9. android weex开发流程,阿里Weex混合app开发工程搭建指南(android为例)
  10. 数据库一对一、一对多、多对多,表设计
  11. 数据挖掘(数据分析)从业指南
  12. laravel路由的配置,别名,路由群组
  13. C语言试题七十九之请编写函数实现自然底数 e=2.718281828
  14. AES128加密算法实现(C语言:ECB加密模式实现)
  15. 什么是邓氏编码DUNS NUMBER?
  16. Ajax实现异步请求步骤
  17. 序:何为高级java开发工程师?
  18. 计算机科学引论2021中文,计算机科学引论(2021英文精编版)
  19. 中国首份AI落地白皮书发布!金融领域最积极,北京供给超沪深总和
  20. NVIDIA官方中文版GPU编程指南v2.20(转载自GZeasy)

热门文章

  1. TMS320F28335的SCI通信-FIFO中断通信实验
  2. 【机器视觉】 dev_update_time算子
  3. 【Qt】QModbusTcpClient类
  4. 【Qt】Qt5.12编译MySQl5.7驱动(在线亲自指导)
  5. java画板抽象类_java 中的 抽象方法 抽象类 和 接口有啥瓜葛
  6. 清华大学 计算机 林伟,研究人员
  7. Jquery 点击当前的标签对象获取值 与JS整理
  8. Python入门--基本输入输出
  9. 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大
  10. gcc版本降级/升级