首页 > 其他分享 >聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)

聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)

时间:2024-01-13 20:23:34浏览次数:33  
标签:Core 拦截器 Console Microsoft 聊一聊 Extensions invocation Castle public

聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)

  合集 - 聊一聊如何整合Microsoft默认的Ioc容器和Castle.Core(4)   1.聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)01-122.聊一聊如何结合Microsoft.Extensions.DependenyInjection和Castle.Core01-12 3.整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)01-12 4.整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)01-13 收起  

前言

今天的第三篇,感觉没啥人看呀,难道没有兄弟跟我有同样的整合需求吗???手动image
image
image
本文会简短一些,介绍下 CastleCore 作为代理库的一些缺点甚至是硬伤

异步支持

先上代码

/// <summary>
/// 异常捕获、日志记录和耗时监控 拦截器 2024-1-12 21:28:22
/// </summary>
public class CatchLoggingInterceptor : IInterceptor
{
    public  void Intercept(IInvocation invocation)
    {
        //TODO:类注释所写的逻辑
        Console.WriteLine("Interceptor  starting...");
        invocation.Proceed();
        Console.WriteLine("Interceptor  ended...");
    }     
}

如上是一个最简单的 CastleCore 拦截器示例,为了该拦截器能在使用的时候可以直接标注在方法上使用,为我们做如下改动:

/// <summary>
/// 异常捕获、日志记录和耗时监控 拦截器 2024-1-12 21:28:22
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class CatchLoggingInterceptor : Attribute, IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        //TODO:类注释所写的逻辑
        Console.WriteLine("Interceptor  starting...");
        invocation.Proceed();
        Console.WriteLine("Interceptor  ended...");
    }
}

public class SampleService : ISampleService
{
    [CatchLoggingInterceptor]
    public virtual Task<string> ShowAsync()
    {
        Console.WriteLine(nameof(ShowAsync));
        return Task.FromResult(nameof(ShowAsync));
    }
}

public interface ISampleService
{
    [CatchLoggingInterceptor]
    Task<string> ShowAsync();
}

使用代码如下

 public static async Task Main(string[] args)
{
    var services = new ServiceCollection();
    services.AddLogging();//此处添加日志服务 伪代码 以便获取ILogger<SampleService>
    services.TryAddSingleton(sp => new ProxyGenerator());
    services.TryAddTransient<SampleService>();
    services.TryAddTransient<ISampleService, SampleService>();
    var sp = services.BuildServiceProvider();

    var generator = sp.GetRequiredService<ProxyGenerator>();
    var instance = sp.GetRequiredService<SampleService>();
    var proxy = generator.CreateClassProxyWithTarget(typeof(SampleService), instance, new CatchLoggingInterceptor()) as SampleService;
    var name = await proxy.ShowAsync();
}

输入如图所示:image

name也可以正常取到值,没问题
看下拦截器的定义 ,我们全部是同步方法,要知道dotnetcore下是推荐所有方法都是异步的, 我们对拦截器做如下改造:

public void Intercept(IInvocation invocation)
{
    invocation.ReturnValue = IntercetpAsync(invocation);
}

private async Task IntercetpAsync(IInvocation invocation)
{
    //TODO:类注释所写的逻辑
    await Console.Out.WriteLineAsync("Interceptor  starting...");
    Console.WriteLine("Interceptor  starting...");
    invocation.Proceed();
    await Console.Out.WriteLineAsync("Interceptor  ended...");
}

如上,拦截器里面使用Console.Out执行了异步方法的拦截,再执行
image
image

此时引出 Castle代理的致命的问题:拦截方法默认无法异步
针对此问题,官方也已显式标明,并提供了具体的解决办法

https://github.com/castleproject/Core/blob/master/docs/dynamicproxy-async-interception.md

这里我推荐 https://www.nuget.org/packages/stakx.DynamicProxy.AsyncInterceptor 的处理办法

其他缺点

  • 拦截器内如何可以使用ioc的生态获取已经有的各项功能服务
  • 某些场景下拦截器是需要传入常量 比方说,操作日志拦截,方法1 可能需要 Name="方法1",而方法二额需要 Name="方法2"

综上

上面三个缺点都是CastleCore 的硬伤,我们都要克服,后文会陆续解决这些问题,请各位看官拭目以待。写文很累,各位能不能dian点个star呢?您的鼓励会让我信心倍增,更新更快。

本文示例代码已上传至 https://gitee.com/gainorloss_259/microsoft-castle.git

标签:Core,拦截器,Console,Microsoft,聊一聊,Extensions,invocation,Castle,public
From: https://www.cnblogs.com/sexintercourse/p/17962872

相关文章

  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)
    聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二) 合集-聊一聊如何整合Microsoft默认的Ioc容器和Castle.Core(4) 1.整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)01-122.聊一聊如何结合Microsoft.Extensions.DependenyI......
  • 聊一聊如何结合Microsoft.Extensions.DependenyInjection和Castle.Core
    聊一聊如何结合Microsoft.Extensions.DependenyInjection和Castle.Core 合集-聊一聊如何整合Microsoft默认的Ioc容器和Castle.Core(4) 1.聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(二)01-122.聊一聊如何结合Microsoft.Extensions.Depend......
  • 聊一聊 .NET高级调试 中必知的符号表
    一:背景1.讲故事在高级调试的旅行中,发现有不少人对符号表不是很清楚,其实简而言之符号表中记录着一些程序的生物特征,比如哪个地址是函数(签名信息),哪个地址是全局变量,静态变量,行号是多少,数据类型是什么等等,目的就是辅助我们可视化的调试,如果没有这些辅助我们看到的都是一些无意义的......
  • 聊一聊 .NET高级调试 中的一些内存术语
    一:背景1.讲故事在高级调试的旅程中,经常会有一些朋友问我什么是工作集(内存),什么是提交大小,什么是VirtualSize,什么是WorkingSet。。。截图如下:既然有很多朋友问,这些用口头也不怎么好描述,刚好上午有时间就系统的聊一下吧。二:内存术语解读1.VirtualSize是什么可能有些朋......
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(完结篇)
    前言书接上回,上回我们了解了castle代理的一些缺点,本文将开始操作整合Microsoft.Extension.Dependency和Castle,以让默认的容器可以支持拦截器我们将以进阶的形式逐步完善我们的封装,以实现一个更方便易用、普适、高性能的基础设施库。基础版还是先上代码,这是基础版本我们......
  • [转][C#][.net Core]
    中文提示:连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Onlytheinvariantcultureissupportedinglobalization-invariantmode.Seehttps://aka.ms/GlobalizationInvariantModeformoreinformation.(Parameter'name')en-usisaninvalid......
  • Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查
    目录什么是Consul?安装和运行ConsulAsp.NetCore如何集成Consul实现服务注册和健康检查Consul.AspNetCore中的AddConsul和AddConsulServiceRegistration方法究竟做了什么?AddConsul方法AddConsulServiceRegistration方法配置Consul检查服务封装成扩展效果什么是C......
  • 聊一聊如何整合Microsoft.Extensions.DependencyInjection和Castle.Core(三)
    前言今天的第三篇,感觉没啥人看呀,难道没有兄弟跟我有同样的整合需求吗???手动,本文会简短一些,介绍下CastleCore作为代理库的一些缺点甚至是硬伤异步支持先上代码///<summary>///异常捕获、日志记录和耗时监控拦截器2024-1-1221:28:22///</summary>publicclassCatch......
  • netcore webpi 通过signalr 给vue项目推送消息
     最近项目上需要做个服务给前端推消息,首先就想到了signalr,关于signalr详情可以参考微软官方文档(ASP.NETCoreSignalR概述|MicrosoftLearn),微软现在也有使用教程(ASP.NETCoreSignalR入门|MicrosoftLearn)微软教程是通过使用库管理器(LibMan)从unpkg 获取客户端库,如......
  • .NET Core MemoryCache缓存批量获取Key或者删除
    .NetCore下使用缓存,除了大家耳熟能详的Redis做分布式缓存外,本地内存缓存也会一起结合来使用,它存取更快,使我们的应用达到极致性能要求。这也是我们经常提到的3级或者4级缓存,每一层都有自己的使用场景,优缺点,结合业务特点来选择合适的才是王道。这里我们就使用Net原生的Microsoft......