首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测井设计方法

测井设计方法
EN

Software Engineering用户
提问于 2013-03-13 13:38:09
回答 2查看 1.2K关注 0票数 4

伐木对我来说一直是个噩梦!现在,我必须为代理系统再次实现它。在这个代理应用程序中,有些系统要求代理系统调用其他一些服务。我要记录的是

  • 请求时间
  • 请求者IP
  • 请求参数作为XML
  • 请求的服务名称
  • 请求服务方法
  • 响应时间
  • 响应数据为XML
  • 响应消息(如果出现任何异常,它将作为消息记录)

我考虑在我的方法中附加两行:

代码语言:javascript
复制
// 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));

我还想记录嵌套的事务。

假设事务包含请求和响应。事务可能包含许多其他内部事务。当我收到一个请求时,我应该注册一个事务,然后为它插入一个请求,稍后,当收到响应时,我应该更新事务响应。请注意,我试图存储请求和响应关系,以更好地跟踪。

如何安全地将此日志过程添加到方法中?我想限制开发人员在所有方法中实现这个日志系统,有些东西,比如接口或方法主体的继承是必需的。我能用属性来做这个吗?那怎么做?

EN

回答 2

Software Engineering用户

发布于 2013-12-27 22:39:20

要限制开发人员对他们想要的任何东西使用日志机制,只在内部使用它的可见性。然后,您可以通过添加InternalsVisibleTo程序集属性,使其仅对您自己的项目可用。

为了安全一致地将日志机制添加到方法中,只在方法中实现功能,并在委托中包装这些方法,类似于以下伪代码的C#:

代码语言:javascript
复制
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;
    }
}
票数 1
EN

Software Engineering用户

发布于 2013-03-13 13:52:29

这是面向方面的编程 (AOP)的hello world场景,我非常喜欢它。您提到的使用属性的问题正是所使用的实现细节。

我个人对.NET的最喜欢,虽然不是免费的(您可以使用反射来滚动您自己的反射,我也有,但是性能比较差)是PostSharp

本质上,您有一个继承自PostSharp方面属性的属性(例如。OnMethodBoundaryAspect)。您将重写OnEntry和OnExit,使异步调用(S)跟踪。

所发生的情况是,PostSharp插件到编译中,并将代码从您的方面“编织”到由编译器生成的IL中,因此其性能与您自己在方法中手工编写它时的性能大致相同。

注:我与postsharp公司没有任何联系,也从未有过机会。(预算)在生产中使用--可悲的是。不过,我在.NET中成功地使用了AOP。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/190397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档