Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理单输入类型&;API中具有接口的多输出类型?_C#_Multithreading - Fatal编程技术网

C# 如何处理单输入类型&;API中具有接口的多输出类型?

C# 如何处理单输入类型&;API中具有接口的多输出类型?,c#,multithreading,C#,Multithreading,我正在建立一个处理库,它将处理来自传感器的测量数据。根据传感器应用的不同,数据可能以不同的方式处理。根据处理类型,处理的输出可能包含1、2或3个输出值 我已经创建了几个enum和interface。以下是关键类型: public enum ProcessingType { Default = 0, Type1 = 1, Type2 = 2 } public interface IProcessItem { ProcessingType GetProcessin

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

我已经创建了几个
enum
interface
。以下是关键类型:

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

public interface IProcessItem
{
    ProcessingType GetProcessingType();
}

public interface IProcessInputs
{
    string GetID();
    float GetTemperature();
    IEnumerable<byte> GetProcessData();
}
从应用程序传递的具体对象应该拥有向测量数据处理器提供所需数据所需的一切,然后将结果保存回某种持久性存储

为输入创建接口很容易,因为它们都是相同的。但是,我不知道如何处理输出。我已经开始为输出类型创建接口:

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.

不确定我是否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()
  {
    ...
  }
}

最后,我为每种处理类型使用了一个处理类型接口的方法。用于处理类型枚举

public enum ProcessingType
{
    Default = 0,
    Type1 = 1, 
    Type2 = 2
}
我为每一个创建了一个接口:

public interface IProcessingTypeDefault {
    //...
}

public interface IProcessingTypeType1 {
    //...
}

public interface IProcessingTypeType2 {
    //...
}

由于每种处理类型都有相似和不同的输入/输出,我认为我可以优化接口。但我意识到,试图优化每个界面的数量和内容将过于复杂,特别是考虑到今后可能会发生的变化,这些变化可能会否定优化。

很抱歉我的问题不清楚。。我脑子里的想法也很模糊。。。我真的不知道如何实现我所需要的。我会仔细看看你的答案,看看是否有用。谢谢当然,如果不是100%清楚的话。客户机将使用IPProcessorFactory创建适当IPProcessor的实例。+1是一个好主意。今天我花时间研究工厂模式。似乎必须在服务器应用程序中创建具体类型,因为需要定制实现来检索数据输入,然后保存输出。可以在服务器应用程序中使用工厂模式来创建正确的类型,但我认为它在流程库中对我没有帮助。
public interface IProcessingTypeDefault {
    //...
}

public interface IProcessingTypeType1 {
    //...
}

public interface IProcessingTypeType2 {
    //...
}