IOC控制反转--.net framework

news2024/11/24 20:10:59

IOC控制反转–.net framework

分层架构:

image-20220323191659045

一、传统依赖倒置实现

  1. 传统工艺:会有依赖,上端全部展示细节
BaseBll baseBll = new BaseBll();
baseBll.DoSomething();
  1. 依赖于抽象:左边依赖倒置,面向抽象

实现类继承接口,实现类实现接口的方法

左边抽象,右边实现类

BaseBll.cs (ZhaoxiFramework.BLL)

public class BaseBll: IBaseBll
{
    public void DoSomething()
    {
        Console.WriteLine("{0} Do Something", this.GetType().Name);
    }
}

调用

IBaseBll baseBll = new BaseBll();
baseBll.DoSomething(); 
  1. 第三方工厂

IPhone.cs(ZhaoxiFramework.Interface)

public interface IPhone
{
    void Call();
    IMicrophone iMicrophone { get; set; }
    IHeadphone iHeadphone { get; set; }
    IPower iPower { get; set; }
}

ObjectFactory.cs(ZhaoxiFramework.IOC.Project)

public static IPhone CreatePhone(IBaseBll iBLL)
{
    string classModule = ConfigurationManager.AppSettings["iPhoneType"];
    Assembly assemly = Assembly.Load(classModule.Split(',')[1]);
    Type type = assemly.GetType(classModule.Split(',')[0]);
    return (IPhone)Activator.CreateInstance(type, new object[] { iBLL });
}

AndroidPhone.cs(ZhaoxiFramework.Service)

public class AndroidPhone : IPhone
{
    public IMicrophone iMicrophone { get; set; }
    public IHeadphone iHeadphone { get; set; }
    public IPower iPower { get; set; }
    
    public AndroidPhone(IBaseBll baseBll)
    {
        Console.WriteLine("{0}构造函数", this.GetType().Name);
    }
}

App.config 文件(ZhaoxiFramework.IOC.Project)

<appSettings>
    <add key="iPhoneType" value="ZhaoxiFramework.Service.AndroidPhone,ZhaoxiFramework.Service" />
</appSettings>

调用(ZhaoxiFramework.IOC.Project)

IBaseBll baseBll = new BaseBll();
IPhone phone = ObjectFactory.CreatePhone(baseBll);

 => 那什么是IOC?

传统工艺是使用new关键词进行对象的创建,依赖于细节;

但是IOC是把对象交个一个第三方的容器来创建,其实本质就是一个工厂 + 配置文件;

上述所讲解到的 第三种方式:第三方工厂,通过工厂来创建对象的时候,如果有参数的情况下,需要把参数的实例事先创建好 new BaseBll(),然后再传递过来 ObjectFactory.CreatePhone(baseBll)

**问题:**那么在创建对象的时候,如果依赖的太多呢?难道每一个以来我们都写一个工厂来创建吗?(以下---> 代表依赖关系,前面一项依赖于后一项)

比如,ApplePhone类 —> Headphone —> Microphone —> Power …

期望: 如果说,对象A —> 对象B —> 对象C;在创建对象A的时候,能够自动的把依赖的对象创建好,传递过来,直接得到想要的对象,那岂不是很舒服。那什么方式能帮助完成这种理想情况呢?

答案: DI(依赖注入),经常和IOC放在一起使用;因为在使用IOC容器的时候,会很容易踩到坑(出现上述所说的多个依赖的关系),DI 这时候就能帮助弥补它。

=> IOC 和 DI 是什么关系?

IOC是一种对象的创建的实现(目标),而DI 是IOC 的一种实现方式

二、Unity 使用

第一步:Nuget 引入三个包,UnityUnity.AbstractionsUnity.Container

第二步:注册抽象和实现

2.1 通过IOC创建实例

有三种关系可以进行实现:1. 接口–实现类、2. 抽象类–子类、3. 普通类–子类

接口–实现类

//创建一个容器
IUnityContainer container = new UnityContainer();
//告诉容器---抽象和细节的关系 
container.RegisterType<IBaseBll, BaseBll>();
//获取对象的实例 
IBaseBll baseBll = container.Resolve<IBaseBll>();	//ZhaoxiFramework.BLL.BaseBll

抽象类–子类

ApplePad.cs(ZhaoxiFramework.Service)

public class ApplePad : AbstractPad
{
    public override void Show()
    {
        Console.WriteLine($"This is {nameof(ApplePad)}");
    }
}

AbstractPad.cs(ZhaoxiFramework.Interface)

public abstract class AbstractPad
{
    public abstract void Show();
}

创建实例:

//创建一个容器
IUnityContainer container = new UnityContainer();
//告诉容器---抽象和细节的关系 
container.RegisterType<AbstractPad, ApplePad>();
//获取对象的实例 
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//输出结果为:ZhaoxiFramework.Service.ApplePad

普通类–子类

IUnityContainer container = new UnityContainer();
container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

2.2 有趣的继承关系

ApplePadChild.cs(ZhaoxiFramework.Service)

public class ApplePadChild : ApplePad
{
    public override void Show()
    {
        base.Show();
        Console.WriteLine($"This is {nameof(ApplePadChild)}");
    }
}

创建实例1:

//创建一个容器
IUnityContainer container = new UnityContainer();
container.RegisterType<AbstractPad, ApplePad>();
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//1.输出结果为:ZhaoxiFramework.Service.ApplePad

container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//2.输出结果为:ZhaoxiFramework.Service.ApplePadChild
AbstractPad applePadChild1 = container.Resolve<AbstractPad>();	//3.输出结果为:ZhaoxiFramework.Service.ApplePadChild

注册完成之后,形成的链式如下:

AbstractPad -> ApplePad -> ApplePadChild

1.输出结果为 ApplePad,是因为 ApplePad -> ApplePadChild 的关系还未注册进行就开始被调用来创建实例了

1.输出结果为 ApplePadChild,是因为 链式关系已经完整了,就返回的最底层的(最后的)类型

创建实例2:

//创建一个容器
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplePad, ApplePadChild>();
AbstractPad applePadChild = container.Resolve<ApplePad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

container.RegisterType<AbstractPad, ApplePad>();
AbstractPad abstractPad = container.Resolve<AbstractPad>();	//输出结果为:ZhaoxiFramework.Service.ApplePadChild

因为 ApplePad, ApplePadChild 已经先注册了,所以在注册 AbstractPad, ApplePad 之后再实例化的时候,期间就会有下面一个链式指向的过程:

AbstractPad -> ApplePad -> ApplePadChild

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React18和React16合成事件原理(附图)

&#x1f4a1; React18合成事件的处理原理 “绝对不是”给当前元素基于addEventListener做的事件绑定&#xff0c;React中的合成事件&#xff0c;都是基于“事件委托”处理的&#xff01; 在React17及以后版本&#xff0c;都是委托给#root这个容器&#xff08;捕获和冒泡都做了…

动态规划入门第1课

1、从计数到选择 ---- 递推与DP&#xff08;动态规划&#xff09; 2、从递归到记忆 ---- 子问题与去重复运算 3、动态规划的要点 第1题 网格路1(grid1) 小x住在左下角(0,0)处&#xff0c;小y在右上角(n,n)处。小x需要通过一段网格路才能到小y家。每次&#xff0c;小x可以选…

视频基础知识

1.视频比特率 视频的比特率是指传输过程中单位时间传输的数据量。可以理解为视频的编码采样率。单位是kbps&#xff0c;即每秒千比特。视频比特率是决定视频清晰度的一个重要指标。比特率越高&#xff0c;视频越清晰&#xff0c;但数据量也会越大。比如一部100分钟的电影&#…

5.4 Bootstrap 下拉菜单(Dropdown)插件

文章目录 Bootstrap 下拉菜单&#xff08;Dropdown&#xff09;插件用法在导航栏内在标签页内 选项方法 Bootstrap 下拉菜单&#xff08;Dropdown&#xff09;插件 Bootstrap 下拉菜单 这一章讲解了下拉菜单&#xff0c;但是没有涉及到交互部分&#xff0c;本章将具体讲解下拉菜…

(链表) 剑指 Offer 58 - I. 翻转单词顺序 ——【Leetcode每日一题】

❓剑指 Offer 06. 从尾到头打印链表 难度&#xff1a;简单 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链…

自己实现数据结构,有更好的可操作性

https://leetcode.cn/problems/asteroid-collision/ 就是说&#xff0c;非得用人家写的栈不可么 stl 的 stack&#xff0c;没办法随机访问&#xff0c;用 vector 或者再不济数组&#xff0c;就好了&#xff0c;非要用 stl 的&#xff0c;就导致还得有另一个 vector 维护向左走…

多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

目录 一、外部种群Archive机制 二、领导者选择机制 三、多目标灰狼算法运行步骤 四、MOGWO的Matlab部分代码详细注释 五、MOGWO算法难点解释 5.1 网格与膨胀因子 5.2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应用于多目标优化问题,在灰狼算法中引入外部种群Archi…

Spring MVC -- 返回数据(静态页面+非静态页面+JSON对象+请求转发与请求重定向)

目录 1. 返回静态页面 2. 返回非静态页面 2.1 ResponseBody 返回页面内容 2.2 RestController ResponseBody Controller 2.3 示例:实现简单计算的功能 3. 返回JSON对象 3.1 实现登录功能&#xff0c;返回 JSON 对象 4. 请求转发(forward)或请求重定向(redirect) 4.1 请…

Day 63 : 集成学习之 AdaBoosting (1. 带权数据集)

63.1 AdaBoosting基本算法&#xff1a;先从初始训练集训练一个弱学习器&#xff0c;在根据弱学习器的表现对训练样本进行权重调整&#xff0c;经过若干轮之后&#xff0c;将得到一组分类器&#xff0c;将数据输入这组分类器后会得到一个综合且准确的的分类结果。“三个臭皮匠&a…

评论管理功能

后端 bp.get("/comment/list") def comment_list():comments CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list []for comment in comments:comment_dict comment.to_dict()comment_list.append(comment_dict)return restful.ok…

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…

【0基础学习python】顺序结构+条件语句+循环结构(文章后面有人生重开模拟器的相关逻辑和简单实现)

1.顺序语句 默认情况下&#xff0c;python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 print(1) print(2) print(3)执行的结果一定为 1 2 3 &#xff0c;而不会出现 3 2 1 或者 1 3 2等&#xff0c;这种按照顺序执行的代码&#xff0c;我们称为顺序语句。 …

C++第六讲

思维导图 顺序栈定义成模板类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/22 16:23.--------------------------------- */ #include<iostream>using namespace std;template<typename T> class my_stack { private:T *p…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

IDEA使用AWS CodeWhisperer

IDEA使用AWS CodeWhisperer 首先在IDEA的插件市场中下载AWS Toolkit&#xff1a; 这里我使用的IDEA是2023.1&#xff0c;就是在ToolWindows里把AWS Toolkit面板调出来&#xff1a; 连接&#xff1a; 打开的网页中粘贴上面提过的代码。进入注册流程。 注册完成后返回IDEA&am…

自动驾驶感知系统-毫米波雷达

毫米波雷达就是电磁波&#xff0c;雷达通过发射无线电信号并接收反射信号来测定车辆与物体间的距离&#xff0c;其频率通常介于10~300GHz之间。与厘米波导引头相比&#xff0c;毫米波导引头体积小&#xff0c;质量轻&#xff0c;空间分辨率高&#xff1b;与红外、激光、电视等光…