Как я сохраняю данные без глобальных переменных?

Это не прямой ответ, а предложение. Пожалуйста, не отрицайте; Я просто пытаюсь быть полезным. После большого опыта работы с PCI, я настоятельно рекомендую вам избегать использования информации о кредитных картах в ваших системах, если это вообще возможно.

Подход, который мы использовали (с большим успехом) - это токенизация. Существуют службы, которые будут собирать и хранить информацию о вашей кредитной карте для вас. Вы делаете вызов API, чтобы получить токен, обычно какой-то хеш, который представляет основной номер счета кредитной карты. Когда вы хотите выставить счет карте, вы передаете токен и другие детали транзакции, и они обрабатывают их платеж.

Вот простая статья о процессе: http://www.creditcards.com/credit-card-news/tokenization-to-fight-credit-card-id-theft-1282.php

Есть много вариантов для этого в эти дни:

Для получения дополнительной информации об этом подходе можно использовать Поиск Google: токенизация кредитных карт .

8
задан ChristianLinnell 21 May 2009 в 22:46
поделиться

5 ответов

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

Лучший способ сделать это - иметь статическое свойство для некоторого разумно названного класса, он фактически становится вашей глобальной переменной

public class Credentials
{
  public static string Username {get;set;}
}

//...somewhere in your code

Credentials.Username = "MyUserName";

EDIT:

Здесь пара человек сказали общее заявление о том, что глобальные переменные - это плохо, и я согласен с этим мнением, и похоже, что разработчики C # также согласны, поскольку они просто недоступны.

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

4
ответ дан 5 December 2019 в 17:40
поделиться

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

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

Как всегда, подумайте внимательно. о введении каких-либо глобалов в ваше приложение, но не бойтесь его использовать. Многие вещи действительно являются глобальными, например, App.Settings, в которых нет ничего "плохого".

1
ответ дан 5 December 2019 в 17:40
поделиться

Это не очень хорошая практика, но если вам это действительно нужно, есть несколько способов:

  1. Веб-приложения: вы можете поместить свою переменную в какой-то контекст, например сеанс или область приложения.
  2. Настольные приложения: вы можете создать объект и сохранить его как свойство класса, у которого всегда есть активный объект.
  3. Любые приложения: используйте общедоступное статическое свойство. Это видно всем.
5
ответ дан 5 December 2019 в 17:40
поделиться

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

Тем не менее, для вашей проблемы это больше похоже на проблему дизайна. C # очень ориентирован на объектно-ориентированный дизайн; Я подозреваю, что из-за проблемы, которую вы указали, более качественный OOD решит вашу проблему.

0
ответ дан 5 December 2019 в 17:40
поделиться

Функция 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);
0
ответ дан 5 December 2019 в 17:40
поделиться
Другие вопросы по тегам:

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