我有一些用WPF编写的日志控制台。此控制台基于RichTextBox。 我通过构造函数依赖注入将此RichTextBox移动到完全不同的类。
class LogManager
{
private readonly System.Windows.Controls.RichTextBox richTextBox;
private readonly FlowDocument flowDocument;
private readonly Paragraph commandParagraph;
public LogManager(System.Windows.Controls.RichTextBox richTextBox)
{
if (richTextBox == null)
{
throw new ArgumentNullException("richTextBox");
}
this.richTextBox = richTextBox;
flowDocument = new FlowDocument();
commandParagraph = new Paragraph();
richTextBox.Document = flowDocument;
// (...)
这就是为什么我可以使用以下方法更改此框的值:
commandParagraph.Inlines.Add(new Run("Some logs message"));
它的工作完全正常但为时已晚。我把我的原木装进了某种包装中,大多数都是在程序完成他的工作后收入的。我猜它是因为只使用一个线程来管理工作'和'记录'。 我通过singleton
引用 LogManagerpublic sealed class UCSSBase : INotifyPropertyChanged
{
private static volatile UCSSBase instance;
private static object syncRoot = new Object();
private UCSSBase()
{
var progress = new Progress<string>(s => CurrentStatusElement = s);
GDM = new GeneticDataManager(progress);
dm = new DataManager(progress);
}
public static UCSSBase Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (UCSSBase.logs == null)
throw new InvalidOperationException("Log console cannot be a null");
if (instance == null)
instance = new UCSSBase();
}
}
return instance;
}
}
private static LogManager logs;
internal static LogManager Logs
{
get
{
return UCSSBase.logs;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
if (UCSSBase.logs != null)
{
throw new InvalidOperationException();
}
UCSSBase.logs = value;
}
}
//(...)
所以,我的问题是,如何轻松更改程序以允许我的LogManager独立于系统的其余部分工作? (我通过这个sigleton在系统的很多地方引用控制台来添加新的日志)