螺纹和SOLID原理

本文关键字:原理 SOLID | 更新日期: 2023-09-27 18:29:18

我有以下代码设置

public interface ILogger
{
  void WriteData(string Data);
}
public class Logger : ILogger
{
  public void WriteData(string Data)
  {
     //Write to disk   
  }
}
public interface ILogic
{
  void ProcessData(string Data);
}
public class Logic : ILogic
{
  private ILogger Logger;
  public Logic(ILogger Logger)
  {
    this.Logger = Logger;
  }
  public void ProcessData(string Data)
  {
     //Do stuff
     Logger.WriteData("Data to write");
  }
}
public class MainEntryPointClass
{
     private BlockingCollection<string> DataInCollection;
     private Task DataInTask;
     private CancellationTokenSource CancellationTokenSource;
     public Start()
     {
        InitializeDataIn();
     }
        private void InitializeDataIn()
        {
            CancellationTokenSource = new CancellationTokenSource();
            DataInCollection = new BlockingCollection<DataInContents>();
            DataInTask = Task.Factory.StartNew(() => ProcessDataIn(CancellationTokenSource.Token));
        }
      private void ProcessDataIn(CancellationToken CancelToken)
        {
            while (!CancelToken.IsCancellationRequested)
            {
                foreach (var item in DataInCollection.GetConsumingEnumerable())
                {
                    Logic.ProcessData(item);
                }
            }
        }
}

因此,我在我的主类中创建了一个新的Task,然后数据被添加到DataInCollection中,以便在数据进入时对其进行排队,我们大约每30毫秒进行一次讨论。这得到了成功的处理。

我现在想在一个单独的线程上将数据写入文件,这样,如果出现磁盘问题,主逻辑检查就不会受到影响。如果存在磁盘问题,则逻辑可以继续。我只是不确定在单独的线程上在哪里写文件?它是在Main类、Logic类还是Logger类中?

螺纹和SOLID原理

Logger的责任是确保它不会阻塞调用者。它可以使用许多不同的策略。你不想把这些策略烘焙到使用它的类中

我会将消息排入BlockingCollection<T>,并让一个IO线程将其写入磁盘。

我还建议您模仿现有的日志记录接口,例如Common.logging的ILog,这样,如果您的"无第三方"要求被取消,您就可以轻松地切换到现有的日志框架。

类似于:

class AsyncLogger:ILogger
{
  public AsyncLogger(ILogger backingLogger)
  {
    new Thread(()=>
      {
        while(true)
        {
          var data=_queue.Take();
          _backingLogger.WriteData(data);
        }
      }
    ).Start();
  }
  public void WriteData(string data)
  {
     _queue.Enqueue(data);
  }
}

(我省略了IO线程的终止条件、字段、多个记录器的处理等内容)

Logger类有望负责日志记录。因此,它似乎是将传入数据记录到磁盘的正确位置。