如何在 dotnet Maui 应用程序中实现拦截器/方面?

问题描述 投票:0回答:1

我正在实现一个 dotnet Maui 应用程序,当我需要某些方面来处理错误和某些响应时。 过去,我使用温莎城堡实现了拦截器,但是在毛伊岛如何实现呢?

开发环境为Visual Studio 2022 v17.6.2 毛伊岛版本:

Installed Workload Id      Manifest Version       Installation Source
---------------------------------------------------------------------
maui-ios                   7.0.86/7.0.100         VS 17.6.33723.286
android                    33.0.46/7.0.100        VS 17.6.33723.286
maui-windows               7.0.86/7.0.100         VS 17.6.33723.286
maui-maccatalyst           7.0.86/7.0.100         VS 17.6.33723.286
maccatalyst                16.4.7054/7.0.100      VS 17.6.33723.286
ios                        16.4.7054/7.0.100      VS 17.6.33723.286
maui-android               7.0.86/7.0.100         VS 17.6.33723.286

目标框架:net7

问题是内置的 DI 解析器不支持拦截器(除非我错过了一些东西)。

autofac maui castle-windsor interceptor aspect
1个回答
1
投票

我就是这样做的。

选择 DI 提供商

内置的Dotnet不支持拦截器。 尝试过温莎城堡,但 nuget 包添加了一个可怕的依赖项列表,因此寻找其他东西。 然后是 Autofac,依赖项列表更加友好(尽管尚未实际检查已部署应用程序中的附加二进制文件大小)。 决定使用 Autofac。

步骤

  • 添加了 Autofac nuget 包
  • 向 MauiProgram.cs 添加了 Autofac 容器注册(基于
    https://stackoverflow.com/questions/73604106/how-to-use-autofac-with-net-maui
public static MauiApp CreateMauiApp()
{
  var builder = MauiApp.CreateBuilder();
  builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>  { ... })
    .ConfigureContainer(new AutofacServiceProviderFactory(), autofacBuilder => {
        // Registrations
        // Don't call the autofacBuilder.Build() here - it is called behind
        // the scenes
        autofacBuilder.RegisterType<Logic>().As<ILogic>() // where Logic is the type to add the aspect to
            .EnableClassInterceptors()
            .InterceptedBy(typeof(LoggingAspect));  // LoggingAspect is the interceptor to implement logging
        autofacBuilder.RegisterType<MainPage>();  // See step below, had to add DI registration for the Maui MainPage
        autofacBuilder.RegisterType<LoggingAspect>();
});
  • 添加了 Autofac.Extensions.DependencyInjection nuget 包
  • 创建了ILogic接口和Logic类(作为演示,这就是要拦截的类)
  • 使用 Autofac 将 ILogic、Logic 注册为 MauiProgram.cs 中的 DI 组件(请参阅上面的代码示例)
  • 使用 Autofac 注册 MainPage(参见上面的代码示例)

添加了一个方面(请参阅https://levelup.gitconnected.com/embracing-aspect-oriented-programming-in-net-2640f9ace519

  • 安装nuget包Autofac.Extras.DynamicProxy
  • 创建日志记录方面(LoggingAspect.cs)
  • 在DI注册中为类注册拦截器(参见上面的代码示例)

此时我面临着拦截同步和异步方法,并且记得这并不容易。幸运的是,我之前有自己的库,添加了 nuget 包 BaseInterceptors 并基于示例 2 实现了日志记录方面:https://www.nuget.org/packages/BaseInterceptors

© www.soinside.com 2019 - 2024. All rights reserved.