Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection 如何为Elixir GenServer进行依赖项注入?_Dependency Injection_Elixir - Fatal编程技术网

Dependency injection 如何为Elixir GenServer进行依赖项注入?

Dependency injection 如何为Elixir GenServer进行依赖项注入?,dependency-injection,elixir,Dependency Injection,Elixir,我正在用Elixir构建一个GenServer,假设它是这样一个简单的队列 defmodule Queue do use GenServer def start_link(name) do GenServer.start_link(__MODULE__, :ok, name: name) end def push(server, msg) do GenServer.call(server, {:subscribe, channel, last_id}) e

我正在用Elixir构建一个GenServer,假设它是这样一个简单的队列

defmodule Queue do
  use GenServer

  def start_link(name) do
    GenServer.start_link(__MODULE__, :ok, name: name)
  end

  def push(server, msg) do
    GenServer.call(server, {:subscribe, channel, last_id})
  end

  def pop(server) do
    GenServer.call(server, {:pop, channel, last_id})
  end

  # handlers here ...
end
{:ok, redis_queue} = Queue.start_link(:RedisQueue, redis_process_pid)
对于这个队列,我希望提供不同的存储后端,如

  • PostgreSQL
  • 雷迪斯
  • 记忆中
  • 文件
诸如此类。这里有一个问题,如何使用这个GenServer进行依赖注入?理想情况下,我希望为数据库后端创建一个具有不同后端的队列

{:ok, db_queue} = Queue.start_link(:DBQueue, db_process_pid)
而对于redis来说,可能是这样的

defmodule Queue do
  use GenServer

  def start_link(name) do
    GenServer.start_link(__MODULE__, :ok, name: name)
  end

  def push(server, msg) do
    GenServer.call(server, {:subscribe, channel, last_id})
  end

  def pop(server) do
    GenServer.call(server, {:pop, channel, last_id})
  end

  # handlers here ...
end
{:ok, redis_queue} = Queue.start_link(:RedisQueue, redis_process_pid)

通过这种方式,我可以创建具有不同后端的相同队列服务器。Elixir为GenServer执行依赖项注入的最佳实践是什么

如果只想存储pid,可以使用GenServer状态来存储它。然后可以从
句柄*
回调函数访问它。例如,以下是队列的情况:

defmodule Queue do
  use GenServer

  def start_link(name, pid) do
    GenServer.start_link(__MODULE__, pid, name: name)
  end

  def init(pid), do: {:ok, pid}

  ...
end
现在,您可以按照自己的意愿启动它:

{:ok, db_queue} = Queue.start_link(:DBQueue, db_process_pid)
然后在
handle.*
回调中,访问上一个参数的状态(在本例中只是一个pid):

def handle_call({:subscribe, channel, last_id}, from, pid) do
  # use the pid and the message to construct a reply
  reply = ...
  {:reply, reply, pid}
end

如果您想存储更多的东西,比如说模块,只需将
pid
随处更改为
%{pid:…,module:…}
。任何Erlang术语都可以用作状态。

如果只想存储pid,可以使用GenServer状态来存储它。然后可以从
句柄*
回调函数访问它。例如,以下是队列的情况:

defmodule Queue do
  use GenServer

  def start_link(name, pid) do
    GenServer.start_link(__MODULE__, pid, name: name)
  end

  def init(pid), do: {:ok, pid}

  ...
end
现在,您可以按照自己的意愿启动它:

{:ok, db_queue} = Queue.start_link(:DBQueue, db_process_pid)
然后在
handle.*
回调中,访问上一个参数的状态(在本例中只是一个pid):

def handle_call({:subscribe, channel, last_id}, from, pid) do
  # use the pid and the message to construct a reply
  reply = ...
  {:reply, reply, pid}
end
如果您想存储更多的东西,比如说模块,只需将
pid
随处更改为
%{pid:…,module:…}
。任何Erlang术语都可以用作状态