Я ищу несколько советов по следующей проблеме.
У меня есть несколько классов, которые являются обертками для многих компонентов USB-оборудования, таких как программируемые шины питания, принтеры этикеток, модули сбора данныхПреобразователи USB в последовательные порты и т. Д.
Каждый из этих классов реализует интерфейс IHardwareDevice, определенный следующим образом ...
public interface IHardwareDevice
{
string VID { get; }
string PID { get; }
}
// Example IHardwareDevice implementation
public class PowerSupply : IHardwareDevice
{
public string VID
{
get { return "0123"; }
}
public string PID
{
get { return "3210"; }
}
}
Приведенный выше интерфейс позволяет каждому устройству USB указывать своего поставщика.и идентификаторы продукта.
У меня также есть статический класс, называемый DeviceManager, который использует функции установки устройства SetupDixxx для обнаружения присутствия любого из USB-устройств, перечисленных выше.Этот класс также имеет возможность включать или отключать указанное устройство.
Краткий обзор класса выглядит следующим образом ...
public static class DeviceManager
{
public static T Find<T>() where T : IHardwareDevice, new()
{
// Uses the SetupDixxx calls to find a VID and PID match
// returns new T() or default(T) depending on whether match was found
}
public static bool Enable(IHardwareDevice obj)
{
// ...
}
public static bool Disable(IHardwareDevice obj)
{
// ...
}
}
Я рассмотрел использование HardwareDeviceAttribute
дляукрасить каждый класс с помощью (атрибут будет содержать VID и PID), но я решил против этого.
Кроме того, в будущем я хочу, чтобы у каждого из классов устройств USB были свои свойства - например, PortName
для преобразователя USB в последовательный интерфейс или PathName
для устройства HID (дляразрешить доступ CreateFile, ReadFile и WriteFile) и т. д. Все они должны быть заполнены значениями, считанными из ветви реестра отдельных устройств (опять же с помощью вызовов функций SetupDixxx).Я рассмотрел расширение интерфейса IHardwareDevice
для включения метода InitializeDevice
, который будет вызываться DeviceManager, но для этого потребуется доступ к ряду неуправляемых структур в классе оборудования, что кажется нежелательным.Другим вариантом было бы украсить пользовательские свойства устройства USB, указав, которые должны быть заполнены DeviceManager
.
Теперь, я думаю, мой вопрос будет - это или это будет хорошая реализациячего я хочу добиться?Есть ли какие-то явно очевидные улучшения, которые мне не хватает?Весь код работает, так что с точки зрения пригодности он абсолютно хорош, но есть ли лучшая и более чистая реализация - поможет ли мне в этом случае шаблон Factory (или любой другой)?
Заранее спасибо,K