IOC Unity

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫”依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

依赖倒置原则:
A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。
B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

Unity是微软patterns & practices组用C#实现的轻量级,可扩展的依赖注入容器,它为方便开发者建立松散耦合的应用程序。

在我们的工作中经常会用到三层架构。UI层复杂界面;BLL层复杂业务逻辑;DLL复杂数据库操作。调用方式为 UI层调用BLL层,BLL层调用DLL层,然后为了抽象,我们会添加一个IBLL层与IDLL层,分别为BLL和DLL的抽象。

如下代码:

IBLL层代码

BLL层代码

namespace BLL
{
    public class ApplePhone : IPhone
    {
        public void Call()
        {
            Console.WriteLine("ApplePhone Call!");
        }
    }
}

BLL层代码

namespace BLL
{
    public class AndroidPhone : IPhone
    {
        public void Call()
        {
            Console.WriteLine("AndroidPhone Call!");
        }
    }
}

界面层:

IPhone phone = new ApplePhone();
phone.Call();

但是这样调用,会让界面依赖于实现层。这种调用方式违背了依赖倒置原则。

当然我们也可以使用工厂模式+配置文件的方式进行优化。

不过我们这里介绍一个更好用的东西 Unity 容器。

Unity容器的初步应用

右击引用-->管理NuGet程序包-->搜索Unity-->安装。(使用的为vs2017,不过过程基本类似)

基本方式

IUnityContainer unityContainer = new UnityContainer();//声明一个容器
unityContainer.RegisterType();//将IPhone与ApplePhone进行映射
IPhone phone = unityContainer.Resolve();//反射创建对象
phone.Call();//调用方法
//输出:ApplePhone Call!

别名方式

IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType("Apple");//设置别名
unityContainer.RegisterType("Android");
IPhone phone1 = unityContainer.Resolve("Apple");//通过别名 创建对象
phone1.Call();//输出:ApplePhone Call!

IPhone phone2 = unityContainer.Resolve("Android");
phone2.Call();//输出:AndroidPhone Call!

依赖注入,多层架构

现在我们再添加一些代码:

IBLL层

namespace IBLL
{
    public interface IPower
    {
    }
}

BLL层

namespace BLL
{
    public class Power : IPower
    {
    }
}
namespace BLL
{
    public class WinPhone : IPhone
    {
        public WinPhone()
        {
            Console.WriteLine("WinPhone 无参数构造函数");
        }

        public WinPhone(IPower power)
        {
            Console.WriteLine("WinPhone IPower参数构造函数");
        }
        public void Call()
        {
            Console.WriteLine("WinPhone Call!");
        }

    }
}

我们对代码做了如下的修改:

然后我们在界面层调用

IUnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType<iphone, winphone>();
var phone = unityContainer.Resolve<iphone>();
phone.Call();
</iphone></iphone,>

在调用时系统抛出一个异常:

`
Resolution of the dependency failed, type = ‘IBLL.IPhone’, name = ‘(none)’.

Exception occurred while: while resolving.

Exception is: InvalidOperationException – The current type, IBLL.IPower, is an interface and cannot be constructed. Are you missing a type mapping?

Original: https://www.cnblogs.com/haowuji/p/9777178.html
Author: 下-个路口
Title: IOC Unity

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606616/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Docker-数据卷管理

    Docker-数据卷管理 1.利用数据卷和数据容器管理数 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Co…

    Linux 2023年6月13日
    093
  • Docker部署

    部署Docker 1.部署docker相关 此章描述在新的服务器上安装docker容器。 1.1 概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apach…

    Linux 2023年6月7日
    0143
  • MobaXterm左侧没有文件列表,没有SCP,不显示文件夹问题处理

    一般情况是你设置的session属性问题,具体做法是右键你的session,选edit session,SSH 如下图: 选择 SFTP protocol 并勾选 Follow S…

    Linux 2023年5月27日
    0145
  • 快速掌握Linux三剑客命令使用

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    098
  • [云计算]腾讯云从业者认证-思维导图

    第一章 云计算基础介绍 第二章 腾讯云服务器产品介绍 第三章 腾讯云网络产品介绍 第四章 腾讯云CDN加速产品介绍 第五章 腾讯云存储产品介绍 第六章 腾讯云数据库产品介绍 第七章…

    Linux 2023年6月13日
    0124
  • js学习笔记之for循环

    for 循环是在您希望创建循环时经常使用的工具。 for 循环的语法如下: for (语句 1; 语句 2; 语句 3) { 要执行的代码块 } 语句 1 在循环(代码块)开始之前…

    Linux 2023年6月13日
    074
  • SpringBoot——自定义Redis缓存Cache

    SpringBoot自带Cache存在问题: 1.生成Key过于简单,容易冲突 默认为cacheNames + ":" + Key2.无法设置过期时间,默认时间…

    Linux 2023年5月28日
    0101
  • 解决USB在虚拟机不显示问题

    电脑重装了下系统,顺带重新装了vmware,发现虚拟机无法识别USB设备,居然连右下角图标和可识别设备都不显示了。 网上找了很多方法,大多是纷繁复杂,且行不行都无法保证。 我发现一…

    Linux 2023年5月27日
    0124
  • Redis高可用架构Sentinel

    1 简介 哨兵是用来解决redis高可用性的,可以监控集群中主从的变化,然后进行故障转移。一套合理的监控机制是Sentinel节点判定节点不可达的重要保证,Redis Sentin…

    Linux 2023年6月13日
    098
  • [极客大挑战 2019]Secret File

    0x01 寻找做题信息 打开环境,查看源代码,发现可疑链接,/Archive_room.php,action.php打开action.php会发生302跳转,查找302跳转无果,百…

    Linux 2023年6月8日
    0100
  • spring boot实现不同生产环境下的文件配置

    spring boot项目开发时不同开发环境,打包生成不同的文件。(避免生产环境得到开发环境时的配置文件) 配置不同生产环境 本文适用于开发环境下需要打包项目至生产环境,避免开发环…

    Linux 2023年6月7日
    094
  • GCC编译C:C++的四个过程

    从源码到可执行程序,经历四个过程: 预处理、编译、汇编和链接,前三步由使用编译器来完成、链接由链接来完成。 编译器将编译工作主要分为预处理,编译和汇编三部 连接器的工作是把各个独立…

    Linux 2023年6月13日
    068
  • Mysql数据库服务端的安装

    一般提到Mysql数据库的安装在工作当中是说的安装数据库管理软件的服务端,服务端的安装可以安装在Windows环境,也可以安装在Linux环境。 Windows环境安装:目前安装比…

    Linux 2023年6月14日
    079
  • django基础

    目录 django三板斧 登录功能 静态文件 request对象方法 pycharm链接MySQL django链接MySQL django orm简介 orm基本使用 *orm数…

    Linux 2023年6月7日
    0120
  • Linux 服务器安全(基本)

    Original: https://www.cnblogs.com/libin-linux/p/16656644.htmlAuthor: LB_运维技术Title: Linux 服…

    Linux 2023年6月13日
    096
  • 大数据——克隆主机并配置集群

    利用VMware的克隆功能,克隆出 hadoop102、 hadoop103、 hadoop104三台主机 克隆完成后,记得修改文件( root用户下) vim /etc/sysc…

    Linux 2023年6月8日
    0308
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球