Запись системы плагина C#

Необходимо использовать IllegalArgumentException (IAE), не NullPointerException (NPE) по следующим причинам:

Первый, NPE JavaDoc явно перечисляет случаи, где NPE является соответствующим. Заметьте, что все они брошены временем выполнения , когда null используется неуместно. Напротив, IAE JavaDoc не мог быть более ясным: "Брошенный, чтобы указать, что метод был передан недопустимый или несоответствующий аргумент". Да, это - Вы!

1110-секундный, когда Вы видите NPE в отслеживании стека, что Вы принимаете? Вероятно то, что кто-то разыменовал null. Когда Вы видите IAE, Вы предполагаете, что вызывающая сторона метода наверху стека передала в недопустимом значении. Снова, последнее предположение верно, первый вводит в заблуждение.

В-третьих, так как IAE ясно разработан для проверки параметров, необходимо ли принять его как выбор по умолчанию исключения, итак, почему Вы выбрали бы NPE вместо этого? Конечно, не для различного поведения - Вы действительно ожидаете, что код вызова поймает NPE's отдельно от IAE и сделает что-то другое в результате? Вы пытаетесь передать более определенное сообщение об ошибке? Но можно сделать это в тексте сообщения об исключении так или иначе, как Вы должны для всех других неправильных параметров.

Четвертый, все другие неправильные данные параметра будут IAE, итак, почему бы не последовательный? Почему случается так, что нелегал null является столь особенным, что это заслуживает отдельного исключения из всех других типов недопустимых аргументов?

Наконец, я принимаю аргумент, данный другими ответами, что части API Java используют NPE этим способом. Однако API Java несовместим со всем от типов исключительной ситуации до соглашений о присвоении имен, таким образом, я думаю, просто вслепую копируя (Ваша любимая часть), API Java не является достаточно хорошим аргументом для превосхождения этих других соображений.

32
задан ROMANIA_engineer 16 August 2017 в 16:01
поделиться

3 ответа

Похоже, у вас есть круговая ссылка. Вы сказали, что ваши плагины ссылаются на Lab.Core.DLL, но вы также сказали, что плагины загружаются из Lab.Core.DLL.

Я неправильно понимаю, что здесь происходит?

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы добавили свой вопрос на вопрос ...

Вам необходимо иметь доступ к Lab.Core.DLL для загружаемого плагина, поскольку это зависимость. Обычно это означает, что он находится в том же каталоге или в GAC.

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

7
ответ дан 27 November 2019 в 21:04
поделиться

В качестве дополнительного ответа я использую эти 2 интерфейса для реализации этого

///<summary>
///</summary>
public interface IPlugin {
    ///<summary>
    ///</summary>
    string Name { get; }
    ///<summary>
    ///</summary>
    string Description { get; }
    ///<summary>
    ///</summary>
    string Author { get; }
    ///<summary>
    ///</summary>
    string Version { get; }

    ///<summary>
    ///</summary>
    IPluginHost Host { get; set; }

    ///<summary>
    ///</summary>
    void Init();
    ///<summary>
    ///</summary>
    void Unload();

    ///<summary>
    ///</summary>
    ///<returns></returns>
    IDictionary<int, string> GetOptions();
    ///<summary>
    ///</summary>
    ///<param name="opcion"></param>
    void ExecuteOption(int option);

}



///<summary>
///</summary>
public interface IPluginHost {
    ///<summary>
    ///</summary>
    IDictionary<string, object> Variables { get; }
    ///<summary>
    ///</summary>
    ///<param name="plugin"></param>
    void Register(IPlugin plugin);
}
6
ответ дан 27 November 2019 в 21:04
поделиться

Платформа управляемой расширяемости (MEF) - это новая библиотека в .NET, которая обеспечивает более широкое повторное использование приложений и компонентов. Используя MEF, приложения .NET могут перейти от статической компиляции к динамической. Если вы создаете расширяемые приложения, расширяемые фреймворки и расширения приложений, тогда MEF для вас.

http://www.codeplex.com/MEF

Изменить: CodePlex уходит - код перемещен на Github только для архивных целей: https://github.com/MicrosoftArchive/mef

28
ответ дан 27 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: