.netCore 动态织入
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Reflection; namespace Aop
{
public class DI
{
public static ServiceProvider services; }
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!"); DI.services = new ServiceCollection().AddTransient(typeof(IPerson), typeof(Student)).BuildServiceProvider(); var Dec = new Decorator<IPerson>();
var x = Dec.Instance(); x.Study();
x.Eat("apple");
Console.ReadKey();
}
} public interface IPerson
{
void Study();
void Eat(string ff);
} public class Student : IPerson
{
public void Eat(string ff)
{
Console.WriteLine("I am Eating--------...sssssssssss.................");
}
public void Study()
{
Console.WriteLine("I am studying--------....................");
}
} public class Decorator<T> : DispatchProxy
{
public T Instance()
{
var t = typeof(T);
var s = nameof(DispatchProxy.Create);
var m = typeof(DispatchProxy).GetMethod(s); var obj = m.MakeGenericMethod(t, this.GetType());// 这两个参数,是DispatchProxy.Create的参数,第一个参数要是接口,第二个参数是实现接口的类型。
// obj.Invoke,返回的是DispatchProxy.Create的执行结果,是继承/实现了两个参数的类型实例。
var dd = obj.Invoke(null, null);//DispatchProxy.Create 这个是静态方法,所以第一个参数为null.这个参数没参数,第二个参数为null
return (T)dd;
} protected override object Invoke(MethodInfo targetMethod, object[] args)
{
Console.WriteLine("执行前");
targetMethod.Invoke(DI.services.GetService<T>(), args); Console.WriteLine("执行后");
return "asd";
}
}
}
核心代码:DispatchProxy.Create
引用在这里
上面的 Instance 也可以写成这样。 只是需要把T 约束为接口
public T Instance()
{
return Create<T, Decorator<T>>();
}
mian 函数写成这样也行
var pp = DispatchProxy.Create<IPerson, Decorator<IPerson>>();
pp.Study();
Console.ReadKey();
.netCore 动态织入的更多相关文章
- AOP 动态织入的.NET实现
AOP(面向切面编程:Aspect Oriented Programming)为诸如日志记录.性能统计.安全控制.事务处理.异常处理等与具体业务逻辑无关,却需要在全局范围进行执行的功能提供了一种良好重 ...
- 动态IL织入框架Harmony简单入手
Harmony是一个开放源代码库,旨在在运行时替换.修饰或修改任何现有C#方法.它的主要用在用Mono语言编写的游戏和插件,但是该技术可以与任何.NET版本一起使用.它还照顾对同一方法的多次更改(它们 ...
- Spring的LoadTimeWeaver(代码织入)
在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入.类加载期织入和运行期织入.编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中:而类加载期织入则指通过特 ...
- Java AOP (2) runtime weaving 【Java 切面编程 (2) 运行时织入】
接上一篇 Java AOP (1) compile time weaving [Java 切面编程 (1) 编译期织入] Dynamic proxy 动态代理 Befor talking abou ...
- 框架源码系列三:手写Spring AOP(AOP分析、AOP概念学习、切面实现、织入实现)
一.AOP分析 问题1:AOP是什么? Aspect Oriented Programming 面向切面编程,在不改变类的代码的情况下,对类方法进行功能增强. 问题2:我们需要做什么? 在我们的框架中 ...
- Spring AOP 之编译期织入、装载期织入、运行时织入(转)
https://blog.csdn.net/wenbingoon/article/details/22888619 一 前言 AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP ...
- Spring的LoadTimeWeaver(代码织入)(转)
https://www.cnblogs.com/wade-luffy/p/6073702.html 在Java 语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入.类加载期织入和运行期织入. ...
- AOP的核心:代理与织入
分为两步: 1.动态生成代理类: 2.织入: 2.6 织入(Weaving) 织入是将增强添加到目标的具体连接点上的过程 . AOP 织入方式: 方式 实现 应用编译期织入 特殊的 Java 编译器. ...
- 曹工说Spring Boot源码(13)-- AspectJ的运行时织入(Load-Time-Weaving),基本内容是讲清楚了(附源码)
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
随机推荐
- VsCode写Python代码!这代码简直和大神一样规范!太漂亮了!
VsCode写Python代码!这代码简直和大神一样规范!太漂亮了! 转 https://www.jianshu.com/p/636306763d89 VsCode虽然没有Pycharm的功能齐 ...
- windows下安装node【转】
windows下安装node报错2503.2502 windows下命令行安装,首先使用管理员权限获取cmd msiexec /package node-v10.16.0-x64.msi 根据提示一步 ...
- Zabbix3.4指定用户才能收到报警的配置
Zabbix3.4指定用户才能收到报警的配置 .下载python微信脚本 #安装simplejson wget https://pypi.python.org/packages/f0/07/26b51 ...
- Closing the Sim-to-Real Loop: Adapting Simulation Randomization with Real World Experience
Closing the Sim-to-Real Loop: Adapting Simulation Randomization with Real World Experience 模拟到实际循环闭环 ...
- 【PHP】php7.2报错The each() function is deprecated. This message will be suppressed on furthe
php7.2以上 废除了 each()方法,项目中用到的地方会出现以下报错 The each() function is deprecated. This message will be suppre ...
- Hashset(不能添加相同的字符进入数组)
参考: https://ke.qq.com/webcourse/index.html#cid=434021&term_id=100518216&taid=377652179413386 ...
- 宣化上人:大佛顶首楞严经四种清净明诲浅释(1)(转自学佛网:http://www.xuefo.net/nr/article23/230609.html)
唐天竺·沙门般剌密帝译 宣化上人主讲 一九八三年四月十七日晚讲于万佛圣城 四种清净明诲,真实不虚 楞严经里的四种清净明诲:断淫.断杀.断偷.断妄,是息息相关的.若犯淫戒,就容易犯杀戒,也容易犯盗戒.妄 ...
- 编译Flink 1.9.0
闲来无事,编个Flink 1.9 玩玩 1.下载flink.flink-shaded 源码.解压 flink flink-shaded 7.0 [venn@venn release]$ ll tota ...
- Swift4.0复习类
1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...
- tcp内存占用/socket内存占用
net.ipv4.tcp_mem 内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看: #getconf PAGESIZE 4096 net.ipv4.t ...