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中.