注入横切关注点的不同方法有哪些?

Sta*_*air 25 .net c# vb.net aop

将横切关注点注入类中的不同方法有哪些,以便在保持代码可测试(TDD或其他)的同时最小化所涉及的类的耦合?

例如,考虑我是否有一个需要日志记录功能和集中式异常管理的类.我应该使用DIP并通过接口将所需的关注点注入需要它们的类中吗?我是否应该使用我传递给每个需要一些交叉功能的类的服务定位器?是否有完全不同的解决方案?我完全问错了吗?

Mar*_*ann 24

装饰设计图案是用于实现横切关注一个很好的起点.

首先,您需要定义一个为相关服务建模的界面.然后,您可以实现该服务的实际功能,而无需考虑您的跨领域问题.

然后,您可以随后实现包装其他实例的装饰类,并实现所需的交叉关注点.

这种方法可以完全用Plain Old C#Objects(POCO)实现,不需要额外的框架.

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


这是使用装饰器的示例.假设您有以下界面:

public interface IMyInterface
{
    void DoStuff(string s);
}
Run Code Online (Sandbox Code Playgroud)

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

public class ConsoleThing : IMyInterface
{
    public void DoStuff(string s)
    {
        Console.WriteLine(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望记录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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

注意:我很少推荐静态接口,因此Log.Write接口不是推荐,而只是作为占位符.在一个真正的实现中,我将一些ILogger接口注入到LoggingThing中.