【发布时间】:2017-11-20 16:21:03
【问题描述】:
我想将我的 Accounts 上下文函数放入它们自己的文件中,然后将它们导入到上下文中,这样我就可以在我的控制器中为 App.Accounts 设置别名并使用导入到上下文中的函数。
请参阅下面的粗略设置。
defmodule App.Accounts.UserAPI do
alias App.Accounts.User
def get_user!(id), do: User.get!(User, id) end
defmacro __using__(_) do
import App.Accounts.UserAPI
end
defmodule App.Accounts do
alias App.Accounts.UserAPI
use UserAPI
end
defmodule AppWeb.UserController do
alias App.Accounts
IO.inspect Accounts.module_info
# [
# module: Ev2.Accounts,
# exports: [__info__: 1, module_info: 0, module_info: 1],
# attributes: [vsn: [234644860605005629180170678994286615550]],
# compile: [options: [:debug_info], version: '7.0.4',
# source: '/Users/.../accounts.ex'],
# native: false,
# md5: <<176, 134, 244, 210, 70, 244, 89, 41, 130, 7, 134, 109, 55, 131, 27, 254>>
# ]
def index(conn, %{"id" => id}) do
Accounts.get_user(id) # Accounts.get_user/1 is not defined
end
end
我目前通过将整个 App.UserAPI 包装在 __using__ 宏和引号中来使其工作,但这感觉很冗长,并且在引号中包装似乎阻止我从 UserAPI 中调用实用程序函数。
为什么UserAPI 函数不出现在Accounts.module_info 导出中?
什么是“正确”的做法?
谢谢!
【问题讨论】: