Есть ли лучший способ ограничить вызов метода, чем передача строки «пароль»? C# - PullRequest
0 голосов
/ 29 мая 2020

Например: Скажем, я хочу, чтобы определенная c функция (A) вызывалась только из 2-х определенных c мест (B и C). Несмотря на то, что можно вызвать A из других мест (функция publi c), я хочу убедиться, что я (или кто-то другой) вызываю метод через функцию B или C, а не напрямую по ошибке.

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

public void A(string callingFrom, object arg1, object arg2)
{
    if (callingFrom != "B" && callingFrom != "C")
        throw new Exception("Call the function via B och C");


    // Some code
}

* И, пожалуйста, не пишите ничего вроде «Если вам нужно сделать что тогда вы в первую очередь сделали что-то не так ». Не всякая кодовая база оптимальна на 100% - мягко говоря ...

Есть мысли?

1 Ответ

1 голос
/ 29 мая 2020

Один из подходов - использовать интерфейсы для управления доступом. Т.е. метод A опубликован c, но не отображается в интерфейсе. B и C получают ссылку на фактический класс, а все остальные получают интерфейс. Эту защиту можно ослабить, забросив объект, но это может затруднить случайное неправильное использование.

Другой вариант - поместить A, B и C в один и тот же проект и сделать A internal .

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

Существует также CallerMemberName , который можно использовать для автоматического добавления вызывающего метода / имени файла.

Существует также класс StackTrace , который может быть используется для проверки вызывающего метода.

Но, пожалуйста, не используйте callerMemberName или StackTrace больше, чем для ведения журнала. Это может легко привести к ошибкам во время выполнения, которые трудно найти, и, поскольку большинство людей этим не занимается, ваши коллеги (нынешние и будущие), вероятно, будут справедливо жаловаться.

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