Elixir Agents видимость области видимости - PullRequest
0 голосов
/ 31 октября 2018

Например я создаю API Client для stackoverflow. Мне нужно передать access_token каждой конечной точке.

Я мог бы сделать это так:

StackClient.answers(access_token, params)
StackClient.badges(access_token, params)

Но я не хочу передавать access_token на каждый запрос. И я улучшил логику, сохранив токен доступа внутри Агента.

def start(access_token) do
  Agent.start_link(fn -> %{access_token: access_token} end, name: __MODULE__)
end

Тогда я использую ApiClient так:

StackClient.start(access_token)
StackClient.answers(params)
StackClient.badges(params)

Но у этого подхода есть большая проблема, потому что у агента есть глобальная область видимости для сервера. И два пользователя могут обнаружить конфликты с access_token.

Ребята! Можно ли настроить видимость агента в пределах одного http-запроса?

Или может быть другой способ уменьшить количество аргументов?

1 Ответ

0 голосов
/ 31 октября 2018

Оттуда есть два пути вперед.

Agent.start_link возвращает {:ok, pid} с идентификатором для нового порожденного процесса, так что вы можете использовать это:

{:ok, pid} = StackClient.start(access_token)
StackClient.answers(pid, params)
StackClient.badges(pid, params)

Или вы можете дать процессу другое имя:

def start(name, access_token) do
  Agent.start_link(fn -> %{access_token: access_token} end, name: name)
end

И используйте это при обращении к процессу:

{:ok, _} = StackClient.start(:my_stack_client, access_token)
StackClient.answers(:my_stack_client, params)
StackClient.badges(:my_stack_client, params)
...