c# - 注入(inject)横切关注点有哪些不同的方法?

标签 c# .net vb.net aop

将横切关注点注入(inject)类的不同方法有哪些,以便我可以最大限度地减少所涉及类的耦合,同时保持代码可测试(TDD 或其他方式)?

例如,考虑一下我是否有一个既需要日志记录功能又需要集中式异常管理的类。我应该使用 DIP 并通过接口(interface)将两个必需的关注点注入(inject)到需要它们的类中吗?我是否应该使用传递给每个需要一些横切功能的类的服务定位器?是否有完全不同的解决方案?我是不是问错了问题?

最佳答案

Decorator设计模式是实现横切关注点的绝佳起点。

首先,您需要定义一个为相关服务建模的接口(interface)。然后,您可以实现该服务的真正功能,而无需考虑您的横切关注点。

然后您可以随后实现包装其他实例的装饰类,并实现所需的横切关注点。

这种方法可以完全使用普通旧 C# 对象 (POCO) 实现,不需要额外的框架。

但是,如果您厌倦了编写所有额外的装饰器,您可能想要使用一个框架。我没有使用显式 AOP 框架的经验,但是大多数 DI 容器,例如 Castle Windsor提供类似 AOP 的功能。


这是一个使用装饰器的例子。假设您有以下界面:

public interface IMyInterface
{
    void DoStuff(string s);
}

您的具体实现可能会做一些非常有趣的事情,例如将字符串写入控制台:

public class ConsoleThing : IMyInterface
{
    public void DoStuff(string s)
    {
        Console.WriteLine(s);
    }
}

如果你想记录 DoStuff 操作,你现在可以实现一个日志装饰器:

public class LoggingThing : IMyInterface
{
    private readonly IMyInterface innerThing;

    public LoggingThing(IMyInterface innerThing)
    {
        this.innerThing = innerThing;
    }

    public void DoStuff(string s)
    {
        this.innerThing.DoStuff(s);
        Log.Write("DoStuff", s);
    }
}

您可以继续编写新的装饰器,例如缓存装饰器或实现安全性的装饰器等,并将它们相互包裹起来。

注意:我很少推荐静态接口(interface),所以Log.Write接口(interface)不是推荐,只是作为占位符的意思。在实际实现中,我会将某种 ILogger 接口(interface)注入(inject)到 LoggingThing 中。

关于c# - 注入(inject)横切关注点有哪些不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1708992/

相关文章:

c# - 命令模式 : Any point in OOP? 的丑陋体验

.net - 在 vb.net 中最佳使用 MID 和 INSTR

vb.net - 一次性删除所有事件处理程序

c# - 将 JsonConverterFactory 添加到 Blazor Webassembly 应用程序

c# - 哪个更好 : delegate {} or () => {}

c# - 使用自定义 API key 中间件的 .Net Core JWT 身份验证

c# - 更新 Cosmos DB TTL 容器设置是否会对旧项目产生影响?

c# - 通过 C#.net 获取 Excel 中命名区域的范围

vb.net - Option Strict On 和 DBNull.Value

xml - 如何使用 xml 和 VB.net 请求和响应?