IOC、DI<5> Unity、AOP、延迟获取对象、检索容器中注册信息

在这里插入图片描述
在这里插入图片描述

Unity.InterceptionExtension.ICallHandler实现一个操作日志记录功能

其它跟上一次一样
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /></configSections><unity><typeAliases><typeAlias  alias="IPhone" type="ZEN.Interface.IPhone,ZEN.Interface"></typeAlias ><typeAlias  alias="IWork" type="ZEN.Interface.IWork,ZEN.Interface"></typeAlias ><typeAlias  alias="IPower" type="ZEN.Interface.IPower,ZEN.Interface"></typeAlias ><typeAlias  alias="ICar" type="ZEN.Interface.ICar,ZEN.Interface"></typeAlias ><typeAlias  alias="Phone" type="ZEN.Service.Phone,ZEN.Service"></typeAlias ><typeAlias  alias="Work" type="ZEN.Service.Work,ZEN.Service"></typeAlias ><typeAlias  alias="Power" type="ZEN.Service.Power,ZEN.Service"></typeAlias ><typeAlias  alias="Car" type="ZEN.Service.TeslaCar,ZEN.Service"></typeAlias ></typeAliases><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers><container name="testContainer"><extension type="Interception"/><register type="IPhone" mapTo="Phone" /><register type="IPower" mapTo="Power" /><register type="ICar" mapTo="Car" name="tesla" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /><param name="val" type="int" value="33"/></method><policyInjection></policyInjection><interceptor type="InterfaceInterceptor"/><!--<interceptionBehavior type="IOC.Common.IOC_AOP.AOP, IOC.Common"/>--></register><register type="IWork" mapTo="Work" />     </container></containers></unity>
</configuration>

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity.Interception.PolicyInjection.Pipeline;namespace IOC.Common.IOC_AOP
{class SimpleCallHandler : ICallHandler{public int Order {get;set;}public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext){Console.WriteLine(input.Target.GetType().Name);return getNext()(input, getNext);}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Unity;
using Unity.Interception.PolicyInjection.Pipeline;
using Unity.Interception.PolicyInjection.Policies;namespace IOC.Common.IOC_AOP
{public class SimpleCallHandlerAttribute : HandlerAttribute{        public override ICallHandler CreateHandler(IUnityContainer container){return new SimpleCallHandler() { Order=this.Order};}}
}

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IOC.Common.IOC_AOP;
namespace ZEN.Interface
{public interface ICar{[SimpleCallHandler]void GetName();void GetPrice();void GetMaxSpeed();}
}

在这里插入图片描述
在这里插入图片描述

对IUnityContainer 进行封装

走指定构造函数

就不需要加特性啦
这样既可完成对象注册的同时对构造函数参数进行注入,此时还有另外一个需求,就是虽然在注册的时候已经对构造函数参数进行了初始化
在Unity中,已经帮我们解决了这个问题,我们可以通过ParameterOverride和ParameterOverrides来实现,其中ParameterOverride是针对一个参数,而ParameterOverrides是针对参数列表,有关注册参数初始化及参数重载的全部代码如下:

1、在使用ParameterOverride方法来重载参数时,如果注册的参数是一个具体的对象就需要使用OnType这个扩展方法来指定对应的类型,否则会报错。

2、在使用ParameterOverrides进行重载参数时,可以使用如上面代码的方式进行指定,但是同样需要使用OnType来指定,不过这个的OnType指定的类型是注册的对象类型。

注册类型同时初始化构造函数参数并重载调用

在这里插入图片描述
》》如果初始化是三个参数的构造函数, Resolve解析,是2个参数,只会替换对应的两个参数。
在这里插入图片描述
在这里插入图片描述
》》集合初始化器 赋值
在这里插入图片描述

》》配置文件
在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using Unity;
using System.Configuration;
using System.IO;
using Microsoft.Practices.Unity.Configuration;
using Unity.Resolution;namespace IOC.Common.IOC_AOP
{public class ZenUnityContainerHelper{private IUnityContainer container;public IUnityContainer Container {private set {container = value;}get {return Container;}}public ZenUnityContainerHelper(){this.container = new UnityContainer() ;ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "CfgFiles\\Unity.Config");//找配置文件的路径Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection(UnityConfigurationSection.SectionName);           section.Configure(container, "testContainer");}public T GetServer<T>(){return container.Resolve<T>();}/// <summary>/// /// </summary>/// <typeparam name="T"></typeparam>/// <param name="configName">配置文件中指定的name,对于同一个接口,多个实现情况</param>/// <returns></returns>public T GetServer<T>(string configName){return container.Resolve<T>(configName);}/// <summary>/// 返回构结函数带参数/// </summary>/// <typeparam name="T">依赖对象</typeparam>/// <param name="parameterList">参数集合(参数名,参数值)</param>/// <returns></returns>public T GetServer<T,M>(Dictionary<string, object> parameterList){var list = new ParameterOverrides();foreach (KeyValuePair<string, object> item in parameterList){list.Add(item.Key, item.Value);}return container.Resolve<T>(list.OnType<M>());}/// <summary>/// 返回构结函数带参数/// </summary>/// <typeparam name="T">依赖对象</typeparam>/// <param name="ConfigName">配置文件中指定的文字(没写会报异常)</param>/// <param name="parameterList">参数集合(参数名,参数值)</param>/// <returns></returns>public T GetServer<T,M>(string configName, Dictionary<string, object> parameterList){var list = new ParameterOverrides();foreach (KeyValuePair<string, object> item in parameterList){list.Add(item.Key, item.Value);}return container.Resolve<T>(configName,list.OnType<M>());}}
}

》》》 使用封装

 ZenUnityContainerHelper zenContainer= new  ZenUnityContainerHelper();var tesla_car = zenContainer.GetServer<ICar>("tesla");tesla_car.GetName();               var xiaomi_car = zenContainer.GetServer<ICar>("xiaomi" );xiaomi_car.GetName();Dictionary<string, object> parm = new Dictionary<string, object>();parm.Add("age", "一百");parm.Add("policy", "遥遥领先");var xiaomi_car1 = zenContainer.GetServer<ICar,XiaoMICar>("xiaomi2", parm);xiaomi_car1.GetName();Console.WriteLine("-----------------------------------");

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Unity.Configuration" /></configSections><unity><typeAliases><typeAlias  alias="IPhone" type="ZEN.Interface.IPhone,ZEN.Interface"></typeAlias ><typeAlias  alias="IWork" type="ZEN.Interface.IWork,ZEN.Interface"></typeAlias ><typeAlias  alias="IPower" type="ZEN.Interface.IPower,ZEN.Interface"></typeAlias ><typeAlias  alias="ICar" type="ZEN.Interface.ICar,ZEN.Interface"></typeAlias ><typeAlias  alias="Phone" type="ZEN.Service.Phone,ZEN.Service"></typeAlias ><typeAlias  alias="Work" type="ZEN.Service.Work,ZEN.Service"></typeAlias ><typeAlias  alias="Power" type="ZEN.Service.Power,ZEN.Service"></typeAlias ><typeAlias  alias="Car" type="ZEN.Service.TeslaCar,ZEN.Service"></typeAlias ><typeAlias  alias="xiaomi" type="ZEN.Service.XiaoMICar,ZEN.Service"></typeAlias ></typeAliases><sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Unity.Interception.Configuration" /><containers><container name="testContainer"><extension type="Interception"/><register type="IPhone" mapTo="Phone" /><register type="IPower" mapTo="Power" /><register type="ICar" mapTo="Car" name="tesla" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /><param name="val" type="int" value="33"/></method><policyInjection></policyInjection><interceptor type="InterfaceInterceptor"/><!--<interceptionBehavior type="IOC.Common.IOC_AOP.AOP, IOC.Common"/>--></register><register type="ICar" mapTo="xiaomi" name="xiaomi" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /></method><policyInjection></policyInjection><interceptor type="InterfaceInterceptor"/><!--<interceptionBehavior type="IOC.Common.IOC_AOP.AOP, IOC.Common"/>--></register><register type="ICar" mapTo="xiaomi" name="xiaomi2" ><property name="work" dependencyType="IWork" /><property name="phone" dependencyType="IPhone" /><method name="InitIphone"><param name="_power" type="IPower" /></method><constructor><param name="age" type="System.String"  /><param name="policy" type="System.String" ></param></constructor><policyInjection></policyInjection><interceptor type="InterfaceInterceptor"/><!--<interceptionBehavior type="IOC.Common.IOC_AOP.AOP, IOC.Common"/>--></register><register type="IWork" mapTo="Work" />     </container></containers></unity>
</configuration>

注册类型同时初始化属性并重载调用

public static void ResolveProperty()
{//注册对象关系时初始化对象的属性container.RegisterType<IXXX, XXX>(new InjectionProperty("Policy", "AA"),new InjectionProperty("Desc", "描述"));Console.WriteLine("-----------默认调用输出-------------");Console.WriteLine(container.Resolve<IXXX().Policy);Console.WriteLine(container.Resolve<IXXX>().Desc);Console.WriteLine("-----------重载后调用输出-------------");//以下2种写法效果是一样的,同上面的构造函数参数重载//var myXXX = container.Resolve<IXXX>(new PropertyOverride("Policy", "重载后"),//    new PropertyOverride("Desc", "重载后的描述"));var myXXX = container.Resolve<IXXX>(new PropertyOverrides(){{"Policy","重载后的"},{"Desc","重载后的描述"}}.OnType<MyClass>());Console.WriteLine(myXXX.Policy);Console.WriteLine(myXXX.Desc);
}

延迟获取对象

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

新手入门python该如何开始学习?学习路线是什么呢?

今天这篇文章从三个点给大家介绍一下新手学习Python的正确路线是什么、python最核心的知识点是什么 Python学习路线 Python学习路线可以大致分为以下几个阶段&#xff0c;每个阶段都包含了一系列核心知识点和技能&#xff1a; 第一阶段&#xff1a;Python基础 Python语言基础…

扫描某个网段下存活的IP:fping

前言&#xff1a; 之前用arp统计过某网段下的ip&#xff0c;但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况&#xff0c;可以使用fping fping命令类似于ping&#xff0c;但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…

递归与迭代

1. 概念区别 递归&#xff08;recursion&#xff09;&#xff1a;递归常被用来描述以自相似方法重复事物的过程&#xff0c;在数学和计算机科学中&#xff0c;指的是在函数定义中使用函数自身的方法。&#xff08;A调用A&#xff09; 迭代&#xff08;iteration&#xff09;&…

nodejs学习之Rollup

官网 https://github.com/rollup/rollup 英文文档 中文文档 是什么 Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xf…

数据挖掘与分析部分实验内容

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

基于声学基元的高质量空间音频生成框架

关键词&#xff1a;人体姿态、声学基元、空间音频建模、体积渲染 过去几年中&#xff0c;渲染和动画制作逼真的3D人体模型技术已经发展成熟&#xff0c;并且达到了令人印象深刻的质量水平。然而&#xff0c;与这些全身模型相关联的空间音频建模&#xff0c;却在很大程度上被忽视…

【C++报错已解决】“Null Pointer Dereference“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在软件开发过程中&#xff0c;遇到 “Null Pointer Dereference” 报错可能会让你感到困惑。这个错误提示通常意味着你的程…

Git分支合并以及分支部分合并 提交记录合并

Git分支合并,以及分支部分合并,提交记录合并 最近工作中用到git分支合并的场景,记录一下. 分支整体合并,合并所有记录 仅合并分支部分代码

《从C/C++到Java入门指南》- 16.多维数组

多维数组 二维数组 打印一下 Java 中的二维数组会发现&#xff0c;打印的是 JVM 中的地址&#xff1a; import java.util.*; public class Main {public static void main(String[] args) {int arr[][] {{1, 2, 3},{4, 5, 6}};int ns[] {3, 4, 1, 3};System.out.println(A…

鸿蒙仓颉语言【互操作InterOp】

interoperate 语言的互操作&#xff0c;是必不可少的核心能力&#xff0c;在不同的操作系统平台上要与不同基础的OS接口api进行交互&#xff0c;以创建更合适的兼容层。 仓颉使用foreign关键字来声明调用的不同操作系统的基础API&#xff0c;声明的同时&#xff0c;明确数据类…

leetcode hot100 (面试复习用)

数组 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4]输出&#xff1a;6解释&#xff1…

【Qt】按钮的属性相关API

目录 一. QPushButton 二. QRadioButton 按钮组 三. QCheckBox Qt中按钮的继承体系如下图 QAbstractButton是一个抽象类&#xff0c;集成了按钮的核心属性和API 按钮说明QPushButton&#xff08;普通按钮&#xff09;最常见的按钮&#xff0c;用于触发操作或者事件。可以设…

习题2.21

(defn rever [a](defn item[l r](if ( nil (first l)) r(item (rest l) (cons (first l) r))))(item a nil)) 这段代码非常有助于理解什么是深度优先&#xff0c;什么是广度优先。 很久没有写习题的代码了&#xff0c;倒不是懒得做习题了&#xff0c;是私事多&#xff0c;状态…

【系统架构设计】数据库系统(三)

数据库系统&#xff08;三&#xff09; 数据库模式与范式数据库设计备份与恢复分布式数据库系统分布式数据库的概念特点分类目标 分布式数据库的架构分布式数据库系统与并行数据库系统 数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 备份与恢复 分布式数据库系统…

macbook pro大模型推理

安装与配置 参考github ollama 链接安装ollama。安装完成后,安装常用的模型,下载速度超快。 性能测试 在进行实际测试之前,我首先对模型进行了预处理,以确保其在 M3 Max 上能够高效运行。测试过程中,我主要关注了以下几个方面: 模型加载时间 加载大型模型通常需要较…

粘弹性和机械塑性等力学行为如何影响细胞行为?

组织和细胞外基质&#xff08;ECM&#xff09;是细胞生存和功能的关键组成部分&#xff0c;它们不仅提供细胞生长和迁移的结构支撑&#xff0c;还通过其力学特性影响着细胞的形态、功能和行为。组织和ECM并非简单的材料&#xff0c;它们展现出复杂且多样的力学行为&#xff0c;…

农场驿站平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;农场资讯管理&#xff0c;卖家管理&#xff0c;用户分享管理&#xff0c;分享类型管理&#xff0c;商品信息管理&#xff0c;商品分类管理&#xff0c;系统管理&#xff0c;订单管…

MATLAB学习日志DAY13

13.矩阵索引&#xff08;1&#xff09; 13.1 下标 上图&#xff01; A 的行 i 和列 j 中的元素通过 A(i,j) 表示。 例如&#xff0c;A(4,2) 表示第四行和第二列中的数字。 在幻方矩阵中&#xff0c; A(4,2) 为 15。 A(1,4) A(2,4) A(3,4) A(4,4) 用来计算 A 第四列中的…

【PB案例学习笔记】-32制作一个简单记事本程序

大家好&#xff0c;我是晓凡。 写在前面 这是PB案例学习笔记系列文章的第32篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码…

JVM基本知识——运行空间

JVM&#xff08;Java Virtual Machine&#xff09;即Java虚拟机&#xff0c;是负责读取java字节码&#xff0c;并在实际的硬件环境中运行。 JVM可以分为三部分&#xff1a;类装载器&#xff08;ClassLoader&#xff09;子系统、内存空间、执行引擎 内存空间&#xff08;运行时…