Общие рекомендации по внедрению шаблонов проектирования - PullRequest
4 голосов
/ 17 августа 2011

Я ищу несколько советов по следующей проблеме.

У меня есть несколько классов, которые являются обертками для многих компонентов 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

1 Ответ

1 голос
/ 17 августа 2011

Я не очень уверен, но я думаю, что модель строителя может вам помочь.Если вы создаете свой объект с помощью компоновщика, вы можете просто инициализировать требуемым количеством атрибутов, оставив другие атрибуты без изменений. ссылка на вики

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...