Проблема дизайна (как избежать поломки LSP) - PullRequest
0 голосов
/ 18 января 2011

Я получил следующие два интерфейса:

interface IModule
{
    IModuleResult Invoke(InstallerContext context, IModuleConfiguration config);
}

interface IModuleConfiguration
{

}

IModuleConfiguration используется для настройки каждого модуля. Он загружает / сохраняет настройки конфигурации в файлах XML и настраивается через веб-приложение.

Поток:

Runner -> Загрузка конфигураций из одного XML-файла -> Загрузка инструкций Runner из другого XML-файла -> Вызов выбранных модулей

Дизайн работает, но каждый модуль работает только со своей конфигурацией. Это нарушает LSP, и мне интересно, есть ли лучший способ создать это.

Использование interface IModule<T> where T : IModuleConfiguration не нарушит LSP, но затруднит работу с каждым модулем (поскольку мне нужно сохранить их как object в List и использовать отражение для их вызова).

1 Ответ

0 голосов
/ 18 января 2011

Мне не совсем понятно, как возникают экземпляры этих типов и в какой степени они должны быть взаимозаменяемыми.Одним из подходов, который может быть полезен в некоторых контекстах, является использование делегатов.Например, предположим, что некоторый тип объекта должен обеспечивать метод для сохранения его состояния и последующего восстановления.Если предполагается, что состояние будет восстановлено в том же объекте, из которого оно было сохранено, подпрограмма «сохранить контекст» может вернуть делегат, который при выполнении восстановит состояние объекта.Делегат может содержать данные любого типа, но весь код будет безопасным по типу.

Другие варианты - сделать IModuleConfiguration универсальным в отношении типа настраиваемого модуля, а IModuleConfiguration содержит ConfigureModuleили метод InvokeModule (который, в свою очередь, передает себя методу Configure или Invoke модуля), или интерфейс IConfiguredModule, метод вызова которого ничего не говорит о конфигурации (ожидается, что экземпляры класса объединят модуль ссоответствующая конфигурация).

Какой подход будет наиболее подходящим, зависит от того, как создаются и используются различные экземпляры.

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