gpt4 book ai didi

c# - AOP for C# dotnet core 2.0,方法体运行前访问方法参数值

转载 作者:太空宇宙 更新时间:2023-11-03 14:57:41 24 4
gpt4 key购买 nike

这是我的方法,我正在尝试验证 componentToSave(或访问方法参数值)并在方法主体运行之前抛出异常。

public Component SaveComponent(Component componentToSave) {
...
}
  1. 我尝试使用 PostSharp,但它不是免费的,还有其他依赖 AutoFac 作为 IoC 的库,但在我当前的设置中,我使用的是 dotnet 核心的内置依赖项注入(inject)。

  2. 我试过了 NConcern它依赖于 CNeptune CNeptune 本身依赖于 .exe file用于编译后绑定(bind),我目前使用 Linux 进行开发和生产,所以我无法使用它,即使我尝试在 Windows 上使用它进行测试,但无法让它与 dotnet 核心一起工作。

  3. 我试过了 this approach (即 ActionFilterServiceFilter)但我只有在 [ServiceFilter(typeof(LoggingActionFilter))] 是通过 Controller 而不是任何其他方法时才让它工作(即 SaveComponent 方法)。

  4. 我尝试使用 RealProxy但显然,dotnet 核心不支持它。

我只是迷路了,也许我把问题复杂化了,但应该有办法。任何帮助将不胜感激。

最佳答案

研究 CQS、装饰器和 SimpleInjector。如果将方法提升为类,则可以让类专用于一件事 (SOLID)。然后,您可以在装饰器上添加横切关注点,这些装饰器将具有与实现相同的接口(interface),但它们必须链接调用。如果验证装饰器失败,那么您的主要逻辑将永远不会被调用。您甚至可以在此处添加所有异常处理以及任何日志记录或重试逻辑或缓存。

编辑

抱歉,之前是在手机上! :)

例如,我将在此处使用您的方法。通常使用 CQS,您将拥有一个用于所有查询(只读)和命令(更改状态)的通用接口(interface)。这样,您的所有逻辑最终都会通过 IQueryHandler 或 ICommandHandler,因此您可以同时向所有逻辑添加横切关注点。不过,我会针对您的问题举一个例子。

public interface ISaveComponent
{
Component SaveComponent(Component componentToSave);
}

public class SaveComponent : ISaveComponent
{
public Component SaveComponent(Component componentToSave)
{
// Do your work here
}
}

public class SaveComponentValidation : ISaveComponent
{
private readonly ISaveComponent _saveComponent;

public SaveComponentValidation(ISaveComponent saveCompnent)
{
_saveComponent = saveCompnent;
}

public Component SaveComponent(Component componentToSave)
{
// Do Validation here
return _saveComponent.SaveComponent(componentToSave);
}
}

如果您让 SimpleInjector (IoC/DI) 为您处理装饰,那么您只需像这样在一行代码中注册它们:

 container.RegisterDecorator(typeof(ISaveComponent), typeof(SaveComponentValidation));

否则,您将不得不像这样手动创建它们:

public class Program
{
public static void Main()
{
ISaveComponent handler = new SaveComponentValidation(new SaveComponent());
handler.SaveComponent(new Component());
}
}

关于c# - AOP for C# dotnet core 2.0,方法体运行前访问方法参数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48124782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com