让我们说我在伞下有两个独立的应用程序,一个是处理所有业务逻辑和诸如此类的核心Elixir应用程序,一个是Web界面(Phoenix framework
,显然)核心应用程序。
所以这个核心应用程序应该能够发送电子邮件,因为它知道发送它们的时间和地点,但问题是电子邮件显然包含HTML代码,并且更容易在凤凰方面呈现它们(特别是考虑到我使用它) phoenix_swoosh
swoosh
的{{1}}套餐比核心应用更容易,但我不想从核心应用调用网络界面的代码,因为它打破了边界(据我所知)并且我不想将凤凰作为依赖添加到核心应用程序,仅用于呈现电子邮件。
所以问题是,解决这个问题的好方法是什么?如何在不突破边界的情况下从核心应用程序发送电子邮件,但最好使用Web界面的渲染引擎?是否可以在核心应用程序中创建某种事件系统,然后在凤凰应用程序中订阅它并实际发送来自凤凰应用程序的电子邮件?
提前谢谢你。如果我的问题不太容易理解,请告诉我:)。
答案 0 :(得分:1)
首先,它取决于您如何在两个项目之间设置依赖关系。我假设您将主应用程序作为依赖项包含在您的Web应用程序中。这使得很难从主应用程序调用Web应用程序中的API。
就个人而言,我会在网络应用程序中设置一个命名的GenServer。它会有一个非常简单的API,如{:send, %{name: "...", email: "...", body: "..."}}
。您可以在主应用中使用简单的API模块,如:
defmodule MyApp.Mailer do
def send(name, email, body) do
GenServer.cast :mail_server, {:send, %{name: name, email: email, body: body}}
end
end
您甚至可以将此和其他共享代码放入可在主应用和网络应用之间共享的单独应用中。
通过使用GenServer处理邮件,它使它成为异步,这可能是一件好事,除非你想要错误处理。您也可以使用GenServer.call
代替GenServer.cast
使其同步。
这可能就是我的意思。
另一种选择可能是为swoosh邮件程序创建一个单独的应用程序。如果您不想要另一个phoenix实例的权重,则可以单独使用swoosh
而不是swoosh_phoenix
。您仍然可以直接使用EEx
模块来呈现模板。你只是错过了观点。但是,我发现在我的大多数应用程序中,我只使用一个电子邮件视图。所以凤凰有点矫枉过正。