Elixir代理可见性范围

时间:2018-10-31 14:44:15

标签: elixir agent

例如,我为堆栈溢出创建API客户端。我需要将access_token传递给每个端点。

我可能会这样:

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

但是我不希望将access_token传递给每个请求。而且我通过将访问令牌存储在Agent中来改进了逻辑。

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 :(得分:1)

从那里开始,有两种前进的方式。

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)