Это не прямой ответ, а предложение. Пожалуйста, не отрицайте; Я просто пытаюсь быть полезным. После большого опыта работы с PCI, я настоятельно рекомендую вам избегать использования информации о кредитных картах в ваших системах, если это вообще возможно.
Подход, который мы использовали (с большим успехом) - это токенизация. Существуют службы, которые будут собирать и хранить информацию о вашей кредитной карте для вас. Вы делаете вызов API, чтобы получить токен, обычно какой-то хеш, который представляет основной номер счета кредитной карты. Когда вы хотите выставить счет карте, вы передаете токен и другие детали транзакции, и они обрабатывают их платеж.
Вот простая статья о процессе: http://www.creditcards.com/credit-card-news/tokenization-to-fight-credit-card-id-theft-1282.php
Есть много вариантов для этого в эти дни:
Для получения дополнительной информации об этом подходе можно использовать Поиск Google: токенизация кредитных карт .
Во-первых, всегда спрашивайте себя, действительно ли вам нужен глобальный сервер, но зачастую этого не происходит. Но если вам действительно нужно иметь один ...
Лучший способ сделать это - иметь статическое свойство для некоторого разумно названного класса, он фактически становится вашей глобальной переменной
public class Credentials
{
public static string Username {get;set;}
}
//...somewhere in your code
Credentials.Username = "MyUserName";
EDIT:
Здесь пара человек сказали общее заявление о том, что глобальные переменные - это плохо, и я согласен с этим мнением, и похоже, что разработчики C # также согласны, поскольку они просто недоступны.
Однако мы должны рассмотреть причины, по которым глобальные переменные являются плохие, и они обычно считаются плохими, потому что вы нарушаете правила инкапсуляции. Статические данные, однако, не обязательно плохо, статические данные хороши тем, что вы можете их инкапсулировать, мой пример выше является очень упрощенным примером этого,
Я бы сказал, что вам, вероятно, следует использовать Шаблон синглтона .
Если вы собираетесь использовать многопоточное приложение, вам также необходимо убедиться, что доступ к свойствам экземпляра синглтона является потокобезопасным.
Как всегда, подумайте внимательно. о введении каких-либо глобалов в ваше приложение, но не бойтесь его использовать. Многие вещи действительно являются глобальными, например, App.Settings, в которых нет ничего "плохого".
Это не очень хорошая практика, но если вам это действительно нужно, есть несколько способов:
В C # одним из способов добиться поведения, аналогичного глобальным переменным, является использование методов статического класса и переменных класса. Статические методы и переменные класса имеют один экземпляр в C # и в некоторой степени похожи на глобальные переменные в других языках.
Тем не менее, для вашей проблемы это больше похоже на проблему дизайна. C # очень ориентирован на объектно-ориентированный дизайн; Я подозреваю, что из-за проблемы, которую вы указали, более качественный OOD решит вашу проблему.
Функция A будет частью класса (назовите ее C). Затем функция A могла бы сохранить учетные данные для входа и предоставить функцию (или в C # свойство) для получения учетных данных. Когда они требуются, вы можете просто использовать свойство для получения сохраненных учетных данных и передать их в функцию B (в другом классе).
class C
{
public void functionA()
{
credentials = obtainCredentials;
}
private LogonCredentials _logonCredentials = null;
public LogonCredentials logonCredentials
{
get { return _logonCredentials; }
}
}
class D
{
public void functionB(LogonCredentials credentials)
{
//do stuff
}
}
///other stuff
///other function ...
...
instanceC = C();
instanceC.functionA();
///more stuff here
instangeD = D();
instanceD.functionB(instanceC.logonCredentials);