.NET Core依赖注入集成Dynamic Proxy

2019-07-27| 发布者: admin| 查看: |

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

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

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

代码如下:

澳门银河国际官网services.addtransient logginginterceptor 
services.addtransient sampleservice 
services.addtransient isampleservice ;
 return proxy;
});

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

services.addtransient logginginterceptor 
services.addtransient sampleservice 
func iserviceprovider, object factory =  = {
 var target = provider.getservice sampleservice 
 var logginginterceptor = provider.getservice logginginterceptor 
 var auditinterceptor = provider.getservice auditinterceptor .tointerceptor;
 var proxy = dynamicproxyextensions.generator.createinterfaceproxywithtarget isampleservice ;
 return proxy;
var servicedescriptor = new servicedescriptor, factory, servicelifetime.transient);
services.add;

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

public static class dependencyinjectionextensions
 public static iservicecollection addservice tservice, timplementation 
 return services.addservice, typeof, lifetime, interceptortypes);
 public static iservicecollection addservice
 services.add);
 func iserviceprovider, object factory =  = 
 var target = provider.getservice;
 list iinterceptor interceptors = interceptortypes.tolist.convertall iinterceptor  as iinterceptor;
 var proxy = dynamicproxyextensions.generator.createinterfaceproxywithtarget);
 return proxy;
 var servicedescriptor = new servicedescriptor;
 services.add;
 return services;
}

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