伐木对我来说一直是个噩梦!现在,我必须为代理系统再次实现它。在这个代理应用程序中,有些系统要求代理系统调用其他一些服务。我要记录的是
我考虑在我的方法中附加两行:
// Log Request
Task.Factory.StartNew(() => Logger.Log(RequestParameters.ToXML(),Assembly.GetCallingAssembly().FullName, MethodBase.GetCurrentMethod().Name, DateTime.Now));
// Invoke requested service and get response
// Log Response
Task.Factory.StartNew(() => Logger.Log(Response.ToXML(), DateTime.Now));我还想记录嵌套的事务。
假设事务包含请求和响应。事务可能包含许多其他内部事务。当我收到一个请求时,我应该注册一个事务,然后为它插入一个请求,稍后,当收到响应时,我应该更新事务响应。请注意,我试图存储请求和响应关系,以更好地跟踪。
如何安全地将此日志过程添加到方法中?我想限制开发人员在所有方法中实现这个日志系统,有些东西,比如接口或方法主体的继承是必需的。我能用属性来做这个吗?那怎么做?
发布于 2013-12-27 22:39:20
要限制开发人员对他们想要的任何东西使用日志机制,只在内部使用它的可见性。然后,您可以通过添加InternalsVisibleTo程序集属性,使其仅对您自己的项目可用。
为了安全一致地将日志机制添加到方法中,只在方法中实现功能,并在委托中包装这些方法,类似于以下伪代码的C#:
internal Func<RequestParameters, Response> WrapServiceClientWithLogger(Func<RequestParameters, Response> callService)
{
return requestParameters => {
// Log Request
Task.Factory.StartNew(() => Logger.Log(requestParameters.ToXML(),
Assembly.GetCallingAssembly().FullName, GetMethodName(callService),
DateTime.Now));
var response = callService(requestParameters);
// Log Response
Task.Factory.StartNew(() => Logger.Log(Response.ToXML(), DateTime.Now));
return response;
}
}发布于 2013-03-13 13:52:29
这是面向方面的编程 (AOP)的hello world场景,我非常喜欢它。您提到的使用属性的问题正是所使用的实现细节。
我个人对.NET的最喜欢,虽然不是免费的(您可以使用反射来滚动您自己的反射,我也有,但是性能比较差)是PostSharp。
本质上,您有一个继承自PostSharp方面属性的属性(例如。OnMethodBoundaryAspect)。您将重写OnEntry和OnExit,使异步调用(S)跟踪。
所发生的情况是,PostSharp插件到编译中,并将代码从您的方面“编织”到由编译器生成的IL中,因此其性能与您自己在方法中手工编写它时的性能大致相同。
注:我与postsharp公司没有任何联系,也从未有过机会。(预算)在生产中使用--可悲的是。不过,我在.NET中成功地使用了AOP。
https://softwareengineering.stackexchange.com/questions/190397
复制相似问题