Передовой опыт. Как разрешить передачу динамических параметров в реализацию, не применяя их к интерфейсу? - PullRequest
0 голосов
/ 03 июля 2019

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

public interface IStorageService
{
    string Store<T>(T object);
    T Retrieve<T>(string reference);
}

Этот интерфейс может иметь несколько реализаций.Например:

  • Локальный, просто использующий словарь в качестве хранилища
  • Облачный, использующий таблицы Azure

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

Заранее благодарим за помощь.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы можете создать токен-сервис, от которого зависят другие сервисы.

Служба токенов несет ответственность за то, чтобы она выдавала действительные (не просроченные) токены и работала достаточно хорошо, чтобы вызываться каждый раз, когда нужен токен. Для этого службе токенов, вероятно, потребуется кэшировать токены и отслеживать срок действия, как это делает AzureServiceTokenProvider .

например

interface ITokenService
{
    Task<string> GetAccessToken(string resource);
}
class AzureTokenService : ITokenService
{
    AzureServiceTokenProvider provider = new AzureServiceTokenProvider();
    public async Task<string> GetAccessToken(string resource)
    {
        return await provider.GetAccessTokenAsync(resource);
    }
}
0 голосов
/ 03 июля 2019

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

Если токен, используемый для подключения к Azure, может меняться при каждом вызове, то он, вероятно, должен быть частью сигнатуры метода, и вам может потребоваться сломать ваше решение.в интерфейсы ILocalStorageService и ICloudStorageService.

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

void Main()
{
    var localStorage = new LocalStorageService();
    var azureStorage = new AzureStorageService("TOKEN_VALUE");
}

public interface IStorageService
{
    string Store<T>(T obj);
    T Retrieve<T>(string reference);
}

public class LocalStorageService : IStorageService
{
    public LocalStorageService() { /* no parameters necessary */ }
    public T Retrieve<T>(string reference) => throw new NotImplementedException();
    public string Store<T>(T obj) => throw new NotImplementedException();
}

public class AzureStorageService : IStorageService
{
    public AzureStorageService(string token) { /* connect to Azure */ }
    public T Retrieve<T>(string reference) => throw new NotImplementedException();
    public string Store<T>(T obj) => throw new NotImplementedException();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...