在《Castle DynamicProxy基本用法》中介绍了如何将DP与Autofac集成使用,而 .NET Core有自己的依赖注入容器,在不依赖第三方容器的基础上,如何实现动态代理就成了一个问题。

.NET Core依赖注入实现动态代理

我们知道,要创建一个代理对象,需要简单的三步:

  • 创建Target
  • 创建Interceptor
  • 使用Target和Interceptor创建代理对象

.NET Core的依赖注入允许我们自定义ServiceDescriptor对象,而在ServiceDescriptor对象中,我们可以定义对象实例化的过程,这个过程叫做factory,通过自定义factory,我们可以类型的动态代理的创建。

代码如下:

services.AddTransient<LoggingInterceptor>();
services.AddTransient<SampleService>(); services.AddTransient<ISampleService>(provider =>
{
var target = provider.GetService<SampleService>();
var loggingInterceptor = provider.GetService<LoggingInterceptor>();
var proxy = DynamicProxyExtensions.Generator.CreateInterfaceProxyWithTarget<ISampleService>(target, loggingInterceptor); return proxy;
});

或者通过实例化ServiceDescriptor的方式进行注入:

services.AddTransient<LoggingInterceptor>();
services.AddTransient<SampleService>(); Func<IServiceProvider, object> factory = (provider) => {
var target = provider.GetService<SampleService>();
var loggingInterceptor = provider.GetService<LoggingInterceptor>();
var auditInterceptor = provider.GetService<AuditInterceptor>().ToInterceptor();
var proxy = DynamicProxyExtensions.Generator.CreateInterfaceProxyWithTarget<ISampleService>(target, loggingInterceptor, auditInterceptor); return proxy;
};
var serviceDescriptor = new ServiceDescriptor(typeof(ISampleService), factory, ServiceLifetime.Transient); services.Add(serviceDescriptor);

通过这种方式,我们可以将动态代理与依赖注入结合起来。但是这样的代码缺少封装,开发效率偏低,在使用过程中还需要对依赖注入、动态代理都有一定了解,为了解决这些问题,我们需要再次封装。

依赖注入与动态代理的简单封装

public static class DependencyInjectionExtensions
{
public static IServiceCollection AddService<TService, TImplementation>(this IServiceCollection services,
ServiceLifetime lifetime, params Type[] interceptorTypes)
{
return services.AddService(typeof(TService), typeof(TImplementation), lifetime, interceptorTypes);
} public static IServiceCollection AddService(this IServiceCollection services, Type serviceType, Type implType,
ServiceLifetime lifetime, params Type[] interceptorTypes)
{
services.Add(new ServiceDescriptor(implType, implType, lifetime)); Func<IServiceProvider, object> factory = (provider) =>
{
var target = provider.GetService(implType); List<IInterceptor> interceptors = interceptorTypes.ToList().ConvertAll<IInterceptor>(interceptorType =>
{
return provider.GetService(interceptorType) as IInterceptor;
}); var proxy = DynamicProxyExtensions.Generator.CreateInterfaceProxyWithTarget(serviceType, target, interceptors.ToArray()); return proxy;
};
var serviceDescriptor = new ServiceDescriptor(serviceType, factory, lifetime);
services.Add(serviceDescriptor); return services;
}
}

在使用时需要注意,一定要先将Interceptor类注入到容器中。

.NET Core依赖注入集成Dynamic Proxy的更多相关文章

  1. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  2. # ASP.NET Core依赖注入解读&使用Autofac替代实现

    标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Aut ...

  3. NET Core依赖注入解读&使用Autofac替代实现

    NET Core依赖注入解读&使用Autofac替代实现 标签: 依赖注入 Autofac ASPNETCore ASP.NET Core依赖注入解读&使用Autofac替代实现 1. ...

  4. ASP.NET Core依赖注入解读&使用Autofac替代实现【转载】

    ASP.NET Core依赖注入解读&使用Autofac替代实现 1. 前言 2. ASP.NET Core 中的DI方式 3. Autofac实现和自定义实现扩展方法 3.1 安装Autof ...

  5. 探索 .NET Core 依赖注入的 IServiceProvider

    在上一篇文章中,我们学习了Microsoft.Extensions.DependencyInjection中的IServiceCollection,包括服务注册转换为ServiceDescriptor ...

  6. net core 依赖注入问题

    net core 依赖注入问题 最近.net core可以跨平台了,这是一个伟大的事情,为了可以赶上两年以后的跨平台部署大潮,我也加入到了学习之列.今天研究的是依赖注入,但是我发现一个问题,困扰我很久 ...

  7. 实现BUG自动检测 - ASP.NET Core依赖注入

    我个人比较懒,能自动做的事绝不手动做,最近在用ASP.NET Core写一个项目,过程中会积累一些方便的工具类或框架,分享出来欢迎大家点评. 如果以后有时间的话,我打算写一个系列的[实现BUG自动检测 ...

  8. [译]ASP.NET Core依赖注入深入讨论

    原文链接:ASP.NET Core Dependency Injection Deep Dive - Joonas W's blog 这篇文章我们来深入探讨ASP.NET Core.MVC Core中 ...

  9. asp.net core 依赖注入几种常见情况

    先读一篇注入入门 全面理解 ASP.NET Core 依赖注入, 学习一下基本使用 然后学习一招, 不使用接口规范, 直接写功能类, 一般情况下可以用来做单例. 参考https://www.cnblo ...

随机推荐

  1. Laravel 菜鸟的晋级之路

    第一阶段:简单的增删改查 这是最开始接触Laravel的一个阶段.如果有PHP经验,那么应该能很快找到MVC的路径,然后驾轻就熟的开始写起来.虽然还显得有些笨拙,不过很快就能做出一些内容了.如果没有P ...

  2. Stream系列(一)Filter方法使用

    Filter 是过滤器,也可以当查询方法使用 EmployeeTestCase.java package com.example.demo; import lombok.extern.log4j.Lo ...

  3. 视频转GIF+GIF录制

    GIF录制 Windows--oCam oCam使用非常简便,它还可以用来录音,录制视频,并且是单文件版,很小,使用也非常方便,如果用来录制GIF,大家导出录制的视频选择GIF格式就可以了: Wind ...

  4. fastjson 1.2.24-基于JdbcRowSetImpl的PoC构造与分析

    前言: 基于fastjson的第一种payload是基于templatesImpl的方式,但是这种方式要求Feature.SupportNonPublicField才能打开非公有属性的反序列化处理,是 ...

  5. OpenStack - keystone 问题 'NoneType' object has no attribute 'service_catalog'

    'NoneType' object has no attribute 'service_catalog' 报错 编辑:/etc/keystone/keystone-paste.ini 在[pipeli ...

  6. scrapy框架安装配置

    scrapy框架 scrapy安装(win) 1.pip insatll wheel 2.下载合适的版本的twisted:http://www.lfd.uci.edu/~gohlke/pythonli ...

  7. 【项目管理】Mybatis-Generator之最完美配置详解

    今天看到了一篇总结特别详细的关于Mybatis-Generator配置文件的文章,特转载进行记录学习使用. 先附上原文地址链接:张思全----全哥文章 <?xml version="1 ...

  8. Scrapy 框架 (学习笔记-1)

    环境: 1.windows 10 2.Python 3.7 3.Scrapy 1.7.3 4.mysql 5.5.53 一.Scrapy 安装 1. Scrapy:是一套基于Twisted的一部处理框 ...

  9. java基础(3)--详解String

    java基础(3)--详解String 其实与八大基本数据类型一样,String也是我们日常中使用非常频繁的对象,但知其然更要知其所以然,现在就去阅读源码深入了解一下String类对象,并解决一些我由 ...

  10. oc工程中oc、swift混编代码打包成静态framework踩坑笔记

    参考资料: https://www.jianshu.com/p/734341f7c242 https://www.jianshu.com/p/55038871e7de   两天时间探索,期间不知道遇到 ...