【问题标题】:How to handle single input type & multi output types with interfaces in an API?如何使用 API 中的接口处理单输入类型和多输出类型?
【发布时间】:2014-11-18 18:10:10
【问题描述】:

我正在构建一个处理库来处理来自传感器的测量数据。根据传感器应用,数据可能会以不同的方式处理。根据处理类型,处理的输出可能包含 1、2 或 3 个输出值。

我创建了几个enuminterface。这些是关键类型:

public enum ProcessingType
{
    Default = 0,
    Type1 = 1, 
    Type2 = 2
}

public interface IProcessItem
{
    ProcessingType GetProcessingType();
}

public interface IProcessInputs
{
    string GetID();
    float GetTemperature();
    IEnumerable<byte> GetProcessData();
}

我基本上是在设计一个必须由另一个应用程序记录和实现的 API。我的进程库将有一个由单例 (like the Multithreaded Singleton example here) 管理的单线程处理队列 (like here)。

使用这个库的应用程序为每个与传感器的连接启动一个新线程;在连接结束时,它会将检索到的数据放入一个对象中,将其传递给我的处理队列,然后终止通信线程。在终止通信之前,应用程序不需要等待处理器完成。线。

单例和队列将接受IProcessItem的:

//Singleton
public sealed class SignalProcessor
{
    //...
    public static SignalProcessor Processor
    {
        get
        {
            //...
            lock (syncRoot)
            {
                processor = new SignalProcessor();
            }
            return processor;
        }
    }

    public void Process(IProcessItem item)
    {
        processQueue.Enqueue(item);
    }
}

//Queue
internal sealed class ProcessQueue : IDisposable
{
    //...
    public void Enqueue(IProcessItem item)
    {
        //add to async queue
    }
}

//Usage
var po = new ProcessObject();
SignalProcessor.Processor.Process(po);
//...complete and kill thread

从应用程序传递的具体对象应该具有向测量数据处理器提供请求数据所需的一切,然后将结果保存回某种持久存储中。

为输入创建界面很容易,因为它们都是相同的。但是,我无法弄清楚如何处理输出。我已经开始为输出类型创建接口:

public interface IProcessOutput1
{
    float Level1 { get; set; }
    SaveData();
}
public interface IProcessOutput2
{
    float Level1 { get; set; }
    float Level2 { get; set; }
    SaveData();
}
//etc

但如果我的处理引擎采用实现IProcessInputs 的对象,如何将输出值保存回对象中?

我想不通的是我是否应该让他们必须在该对象上实现多个接口,例如:

internal class ProcessObject1 : IProcessItem, IProcessInputs, IProcessOutput1
{
    //interface implementations
}

internal class ProcessObject2 : IProcessItem, IProcessInputs, IProcessOutput2
{
    //interface implementations
}

或者如果我应该为每种处理类型将接口合并为一个:

public interface IProcessType2 : IProcessItem
{
    int GetID();
    float GetTemp();
    float Level1 { get; set; }
    float Level2 { get; set; }
    SaveData();
}
//etc.

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    不确定我是否 100% 关注,但听起来像工厂模式,将 ProcessingType 枚举作为参数可能满足您的需求。比如……

    public interface IProcessorFactory
    {
      IProcessor Create(ProcessingType type);
    }
    
    internal class ProcessorFactory : IProcessorFactory
    {
      IProcessor Create(ProcessingType type)
      {
        IProcessor processor = null;
        // switch statement or perhaps indivual factory implementations for each processor type.
        // pick your poison
        switch(type)
        {
          case ProcessingType.Default:
            processor = new DefaultProcessor();
            break;
          ... etc.
        }
    
        return processor;
      }
    }
    
    public interface IProcessor
    {
        int GetID();
        float Value { get; set; }
        void SaveData();
    }
    
    internal class DefaultProcessor : IProcessor
    {
      float Value { get; set; }
    
      int GetID()
      {
        ...
      }
    
      void SaveData()
      {
        ...
      }
    }
    

    【讨论】:

    • 我很抱歉我的问题不清楚。我脑子里的想法也很模糊......我不确定如何实现我需要的东西。我会看看你的答案,看看它是否有帮助。谢谢!
    • 当然,如果不是 100% 清楚。客户端将使用 IProcessorFactory 创建相应 IProcessor 的实例。
    • +1 表示好主意。我今天花时间研究工厂模式。似乎必须在服务器应用程序中创建具体类型,因为需要自定义实现来检索数据输入然后保存输出。可以在服务器应用程序中使用工厂模式来创建正确的类型,但我认为它不会在流程库中帮助我。
    【解决方案2】:

    我最终为每种处理类型使用了 1 个处理类型接口的方法。对于处理类型枚举

    public enum ProcessingType
    {
        Default = 0,
        Type1 = 1, 
        Type2 = 2
    }
    

    我为每一个都创建了一个界面:

    public interface IProcessingTypeDefault {
        //...
    }
    
    public interface IProcessingTypeType1 {
        //...
    }
    
    public interface IProcessingTypeType2 {
        //...
    }
    

    由于每种处理类型都有相似和不同的输入/输出,我认为我可以优化接口。但我意识到尝试优化每个界面的数量和内容会过于复杂,尤其是考虑到未来可能会导致优化无效的潜在变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-17
      • 2013-10-04
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多