抱歉,文字太长。
我有一个 C# 类库,它从各种系统检索信息、调用外部函数、验证此信息并将验证结果生成到文件中。该库可以从以下位置模糊地调用:1) DOS 控制台程序,2) Windows 窗体或 3) Windows 服务程序。
用户要求我修改该库,以便它可以以详细的方式运行,即显示某些步骤的日期和时间,简要解释某个步骤或方法正在做什么,等等。他们还要求我提供引入异常处理并显示错误消息。
如果我在控制台模式下执行,我应该在控制台上显示消息,如果我从 Windows 窗体执行,我应该将消息发送到消息框或文本框,如果我从 Windows 服务运行,我应该将消息发送到消息框或文本框。应该将消息发送到日志文件。
我有 2 个问题:
1) 我应该如何修改 C# 类才能避免不断的求值: 如果程序处于控制台模式 writeline….. 否则,如果程序处于 Windows 窗体模式 messagebox 或 textbox.text ... 否则,如果程序是从 Windows 服务程序 writelogfile 调用的……
2) 如果上述评估不可避免,我如何知道 C# 类库是否被控制台、Windows 窗体 Windows 服务程序调用?
谢谢!!
可能的解决方案:
我读了一些关于 MS Enterprise Library 的内容,...这对于我的适度要求来说太多了,所以我选择了 Reed 的实用解决方案。
我分享的是我解决用户需求的方法,这是应用到实际情况之前的一个初步模型,所以在接受Reed解决方案之前,非常欢迎您提出改进和学习的意见。
1) 我创建了一个小库来定义所有可能的输出,在本例中我仅定义了控制台和 WPF 表单的输出:
命名空间diClass { 公共(public)接口(interface)IVerbose { 无效显示(字符串消息,对象文本框); 无效通知(字符串消息); }
public class ConsoleOutput : IVerbose
{
public void show(string msg, object textBox)
{
System.Console.WriteLine(msg);
}
public void notify(string msg)
{
System.Console.WriteLine("Notif: " + msg);
}
}
public class WpfOutput : IVerbose
{
public void show(string msg, object textBox)
{
TextBox tb = (TextBox)textBox;
tb.Text += msg + "\r\n";
System.Windows.Forms.Application.DoEvents();
}
public void notify(string msg)
{
MessageBox.Show(msg);
}
}
public class Output
{
IVerbose outputType;
public IVerbose verboseType
{
get { return outputType; }
set { outputType = value; }
}
public void show(string msg, object textBox)
{
outputType.show(msg, textBox);
}
public void notify(string msg)
{
outputType.notify(msg);
}
}
}
2)然后我定义了一个使用上述库的控制台程序:
class Program
{
static void Main(string[] args)
{
IVerbose verboseType = (IVerbose)Activator.CreateInstance(typeof(diClass.ConsoleOutput));
Output o = new Output();
o.verboseType = verboseType;
object textBox1 = null;
o.show(string.Format("{0}: Reading Accountig data", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")), textBox1);
o.notify(string.Format("{0}: Application error", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")));
}
}
3)最后我定义了一个也使用上述库的WPF程序:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
IVerbose verboseType = (IVerbose)Activator.CreateInstance(typeof(diClass.WpfOutput));
Output o = new Output();
o.verboseType = verboseType;
o.show(string.Format("{0}: Reading Accountig data", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")), textBox1);
o.notify(string.Format("{0}: Application error", DateTime.Now.ToString("dd/MM/yy hh:mm:ss")));
}
}
在程序 2) 和 3) 中,最后两行代码是相等的,没有 if 并且,这就是我想要的答案。
问候。
最佳答案
不要尝试处理所有这些情况,而是考虑添加写入详细日志的日志记录(例如 Enterprise Library Logging Application Block 或任何其他日志记录工具),这将帮助您满足所有要求,即时间戳、方法执行信息、异常、错误。
关于c# - 如何根据程序的性质显示消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1959377/