【发布时间】:2012-03-20 12:16:45
【问题描述】:
我正在尝试在服务工作流混合应用程序中实现日志记录机制。日志记录的要求是,对于独立的日志操作,每个日志都必须被视为一个详细操作,并针对父/主操作放置。所以,它是一个父子,并进入数据库表。这是主要原因,NLog 失败。
为了帮助更好地理解,我将深入介绍一般细节。应用程序流程是这样的:
现在,应用程序(通常称为 Program.cs)的主入口点是 Platform。它初始化一个引擎,该引擎能够侦听来自 ISDN 线路、VoIP 或 Web 服务的传入呼叫。该接口是通用接口,因此任何到达 Platform 的调用都会触发 OnConnecting()。 OnConnecting() 是一个线程安全事件,可以根据系统需要多次触发。
在OnConnecting()中,我们的自定义工作流管理器的一个新实例被启动,上下文是一个名为ProcessingInfo的自定义对象:
new WorkflowManager<ZeProcessingInfo>();
在哪里,ZeProcessingInfo:
var ZeProcessingInfo = new ProcessingInfo(this, new LogMaster());
如您所见,ProcessingInfo 由Platform 本身和一个新的LogMaster 实例组成。 LogMaster 是在一个独立的程序集中定义的。
现在,这个 LogMaster 在整个 WorkflowManager、它启动的所有工作流、任何正在运行的Workflow 中的所有活动都可用,并传递到从任何 Activity 中调用的外部代码。现在,当初始化一个新的 LogMaster 时,会在数据库中创建一个 Master Operation 条目,并且这个 LogMaster 对象现在一直存在,直到此调用结束在经历了一系列非常严肃的过山车之后,经历了不同的工作流程。在每次调用 OnConnecting() 时,都会创建并维护一个新的主操作。
LogMaster 允许调用 AddDetail() 方法,在内部存储的主操作(通过 Guid 主键区分)下添加新的子细节。 LogMaster 建立在实体框架之上。
而且,我可以根据需要多次登录同一个主操作。但是应用程序的需求正在发生变化,现在需要从其他程序集中进行日志记录。 Platform Server 程序集是一个 Windows 服务,它充当服务器侦听基于 Web 服务的调用,一旦客户端调用方法,OnConnecting 在 Platform 被触发。
我需要一种机制来以某种方式检索相关的 LogMaster 对象,以便我可以向同一个主操作添加详细信息。但是Platform Server是一次触发Platform上的OnConnecting(),从而实例化LogMaster。这会产生冗余循环。
此外,还考虑了故障情况。如果 LogMaster 失败,需要从 Database Logging 恢复到 Event Logging。如果 Event Logging 失败(或通过统一配置不允许),则需要恢复为基于文件 (XML) 的日志记录。
我希望我给出了一个粗略的想法。我不期望代码,但我需要一些策略来实现非常无缝的可插入可配置日志记录机制,该机制支持主子操作。
感谢阅读。任何帮助将不胜感激。
【问题讨论】:
标签: c#-4.0 logging workflow-foundation-4 entity-framework-4.3