Я строю библиотеку обработки, которая будет обрабатывать данные измерений из сенсора. В зависимости от приложения датчика данные могут обрабатываться по-разному. Результат обработки может содержать 1, 2 или 3 выходных значения в зависимости от типа обработки.Как обрабатывать типы ввода и типы вывода с интерфейсами в API?
Я создал несколько 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();
}
я в основном проектировании API, которые должны быть документированы и реализованы другим приложением. Моя библиотека процессов будет иметь одну очередь с потоковой обработкой (like here), управляемую одноточечным (like the Multithreaded Singleton example here).
Приложение, использующее эту библиотеку, создает новый поток для каждого подключения к датчику; в конце соединения он поместит полученные данные в объект, передаст его в мою очередь обработки и убьет поток связи. Приложение не должно дождаться завершения обработки процессора, прежде чем убить коммит. нить.
Одноэлементный и очередь будет принимать IProcessItem
«s:
//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.
Прошу прощения за то, что я не понимаю в своем вопросе. Это тоже довольно нечеткая идея в моей голове ... Я не совсем уверен, как реализовать то, что мне нужно. Я просмотрю ваш ответ и посмотрю, поможет ли это. Благодаря! – jwatts1980
Уверен, и в случае, если он не станет на 100% понятным. Клиент будет использовать IProcessorFactory для создания экземпляра соответствующего IProcessor. –
+1 за хорошую идею. Сегодня я провел время, изучая образец фабрики. Кажется, что конкретный тип (ы) должен быть создан в серверном приложении, потому что для извлечения данных необходимо выполнить специальную реализацию, а затем сохранить выходы. Шаблон фабрики можно использовать в приложении сервера для создания правильного типа, но я не думаю, что это поможет мне в библиотеке процессов. – jwatts1980