我在我的操作服务类中使用loggin
public class MyServiceImplementation : IServiceInterface
{
static Logger log = LogManager.GetCurrentClassLogger();
public bool A()
{
try
{
log.Trace("Started");
// Do something A
log.Trace("Completed");
return true;
}
catch( Exception e )
{
log.Error(e);
}
return false;
}
public bool B()
{
try
{
log.Trace("Started");
// Do something B
log.Trace("Completed");
return true;
}
catch( Exception e )
{
log.Error(e);
}
return false;
}
}
结果在log中我看到漂亮的记录为
MyServiceImplementation:B Started
MyServiceImplementation:B Completed
MyServiceImplementation:A Started
MyServiceImplementation:A Completed
但是看看代码设计,由于逻辑重复,它并不漂亮,我想写成
public class MyServiceImplementation : IServiceInterface
{
static Logger log = LogManager.GetCurrentClassLogger();
private bool CallMethod( Action m )
{
try
{
log.Trace("Started");
m();
log.Trace("Completed");
return true;
}
catch( Exception e )
{
log.Error(e);
}
return false;
}
public bool A()
{
return CallMethod(()=> { //Do Something A } )
}
public bool A()
{
return CallMethod(()=> { //Do Something B } )
}
}
但是在这种情况下我在日志中丢失了堆栈跟踪,有关A或B方法的信息正在调用丢失,我在所有情况下都看到了CallMethod
MyServiceImplementation:CallMethod Started
MyServiceImplementation:CallMethod Completed
MyServiceImplementation:CallMethod Started
MyServiceImplementation:CallMethod Completed
如何实现两个目标 - 漂亮的日志记录和漂亮的代码?
答案 0 :(得分:0)
Decorator pattern是你的朋友。
即
interface Iservice{
bool A()
bool B()
}
class ServiceImpl : Iservice {
bool A(){//do something}
bool B(){//do something}
}
class LoggedServiceImpl : Iservice{
Iservice innerService:
public LoggedServiceImpl(Iservice innerServ){
innerService = innerServ;
}
public bool A(){
trace("A started");
bool res = innerService.A
trace("A ended");
return res
}
public bool B(){
trace("B started");
bool res = innerService.B
trace("B ended");
return res
}
}
Iservice myService = new ServiceImpl();
Iservice myLoggedService = new LoggedServiceImpl(Iservice);
Console.WriteLine(Iservice.A();)
Console.WriteLine(Iservice.B();)
或者您可以像PostSharp一样使用AOP库。 AOP非常适合像伐木这样的横切关注。
或者您可以使用像Microsoft Unity这样的DI容器拦截,这是一种基本的,有限的AOP,不需要AOP编译器或在二进制输出结果中发布编译器更改。