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)

大家都在看

  • 五分钟搭建博客系统 OK?

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概要: 通过 Docker Compose 在使用 Docker容器构建的隔离环境中轻松运行 WordPress。…

    Linux 2023年6月14日
    0123
  • redis重点是 dir 的默认配置一定要改

    find / -name dump.rdb 发现有两个dump文件,这两个文件目录不一致,问题在于 redis.conf 文件属性dir,默认配置是dir ./ 表示在哪启动ser…

    Linux 2023年5月28日
    074
  • Linux(进阶篇)

    一、进程 1 进程和内存管理 1.1 进程和线程的区别 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路…

    Linux 2023年6月7日
    079
  • Linux——配置主从数据库服务

    主从数据库 Linux中,数据库服务有三种:互为主主,互为主从,一主一从(主从数据库) 服务名 mariadb 协议名 mysql 进程名称 mysqld 端口号 3306 一、改…

    Linux 2023年5月27日
    0102
  • 013 Linux 搞懂「文件所属者更改及权限的赋予」从未如此简单(chmod、chgrp、chown)

    01 一图详解「ls -l」 02 两种符号区分表示文件和目录 03 三种访问权限及表示 04 四种符号表示文件所属者用户 05 三个变更文件所属者及修改所属者权限的命令 06 工…

    Linux 2023年5月27日
    073
  • UWP Add transport control button to taskbar preview

    I want to add transport control button to taskbar preview, like Netease Music. This is rea…

    Linux 2023年6月13日
    094
  • rsync

    rsync是什么 rsync特性 1)可以镜像保存整个目录树和文件系统。 2)可以很容易做到保持原来文件的权限、时间、软硬连接等。 3)无需特殊权限即可安装。 4)快速:第一次同步…

    Linux 2023年6月6日
    084
  • Docker基础知识

    Docker 是什么 Docker 经常被提起的特点: Docker 技术的基础: Docker 组件: Docker 安装 Docker 常见命令 容器相关操作 获取容器相关信息…

    Linux 2023年6月7日
    0104
  • 解析库的使用

    使用 Xpath 使用 pyquery from pyquery import PyQuery as pq doc = pq(html) print(doc) PyQuery对象可…

    Linux 2023年6月7日
    081
  • 用 shell 脚本做 tcp 协议模拟

    问题背景 公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分。看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪。由于消息是从后…

    Linux 2023年6月6日
    0135
  • Redis配置参数详解

    Redis是一个应用非常广泛的高性能Key-Value型数据库,与memcached类似,但功能更加强大!本文将按照不同功能模块的方式,依次对各个功能模块的配置参数进行详细介绍。 …

    Linux 2023年5月28日
    074
  • 渗透测试常用方法总结

    转载自 https://blog.csdn.net/qq_42636435/article/details/92839738 Original: https://www.cnblo…

    Linux 2023年6月7日
    066
  • c++的bind使用方法

    c++的bind使用方法 除了容器有适配器之外,其实函数也提供了适配器,适配器的特点就是将一个类型改装成为拥有子集功能的新的类型。其中函数的适配器典型的就是通过 std::bind…

    Linux 2023年6月14日
    083
  • powershell遇到错误即推出的方法

    $ErrorActionPreference = “Stop”; $tcpClient = new-object Net.Sockets.TcpClient…

    Linux 2023年5月28日
    078
  • shell之常用的一些命令

    前言 自我感觉学习shell要常用man,–help这样挺方便去写的,光靠熟练远远不够的 bash;gutter:false;</p> <h1>!/bin…

    Linux 2023年6月8日
    080
  • 错误域控降级导致解析问题

    近两天在给分部安装辅助域控的时候,总是安装不成功,或者安装时成功了但是无法复制主域或者其他域控的信息,同步失败,还有就是它一直没有网。 解决方案 经过排查发现域名dns解析不对,经…

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