【发布时间】:2021-04-07 02:33:24
【问题描述】:
我有一个应用程序应该支持多种类型的存储。目前,我希望它同时支持 S3 和 swift。
现在的问题是:我如何允许我的应用程序选择在加载时使用哪个后端(例如,配置将指定它是 S3 还是 swift)?
在 OOP 中,我将拥有接口,并且可以注入依赖项。在这种情况下,显而易见的答案是 GenServer。但我实际上并不需要一个完整的专用进程(它也应该成为我的代码的阻塞点)。
我考虑过简单地将模块的引用作为参数传递,但感觉有点不确定,因为从技术上讲,可能会传递不正确的实现。
因此进一步说明:如何根据配置(没有 Genserver)将特定后端(S3 或 swift)注入我的代码?
defmodule App.Filestorage do
@callback store(String.t) :: :ok | :error
end
defmodule App.S3 do
@behaviour App.Filestorage
@impl
def store(path), do: :ok
end
defmodule App.Swift do
@behaviour App.Filestorage
@impl
def store(path), do: :ok
end
defmodule App.Foo do
def do_stuff()
# doing some stuff
App.Filestorage.store(result_file) # replace this with S3 or Swift
end
end
【问题讨论】:
标签: elixir