我创建了一个提供消息,电子邮件和短信的类库(程序集)。这个类库定义了一个接口IMessenger,它由EmailMessage和SmsMessage类实现。
我看到这是一个通用库,它将成为我的基础架构层的一部分,可以/可以在任何开发中使用。
现在,在我的应用程序层中,我有一个需要使用消息传递组件的类,我显然想要使用我创建的消息传递库。另外,我将使用IoC容器(Spring.net)允许我注入我的实现,即电子邮件或短信。
因此,我想针对我的应用程序层类中的接口进行编程,那么我是否需要从我的应用程序层类引用我的消息类库?
这是否将我的应用程序层类紧密耦合到我的消息类库?
我应该在一个单独的库中定义界面 - IMessenger吗?
或者我应该做些什么?
答案 0 :(得分:1)
这完全取决于您未来的IMessenger计划。就个人而言,我没有发现在同一个程序集中使用接口以及一些示例实现是一件坏事。如果有人想提供IMessenger的新实现,他们将不得不在另一个程序集中执行它,并且在引入程序集的过程中,他们将获得EmailMessage,SmsMessage等。对于轻量级程序集,我认为这不是什么大不了的事,因为它为您节省了每次想要使用它时引用“接口”和“实现”程序集的工作量。
如果您的实现类引用了与您的组织相关的其他代码或您不希望暴露的任何内容,那么将IMessenger分离到自己的程序集并根据需要分发它会更有意义。
答案 1 :(得分:1)
将应用程序层类引用(并因此耦合)到消息库没有任何问题。只要您的邮件库是独立的并且不知道其用户就可以了。
此外,不要因建筑事实过度设计。它应该有目的,利益应该大于成本。
答案 2 :(得分:0)
我对你问题的回答:
“因此,我想针对我的应用程序层类中的接口进行编程,那么我是否需要从应用程序层类引用我的消息类库?” NO
“这是否将我的应用程序层类紧密耦合到我的消息类库?”是
“我应该在一个单独的库中定义界面 - IMessenger吗?”是的
如果您正在使用IoC容器,请注入依赖项,不要将您的应用程序与基础结构实现相结合。
我的实现是将IMessenger接口放在应用程序层中,以便允许我的app对象与接口通信,无论其实现如何。我会在一个单独的程序集中发送一般的电子邮件和短信,并实施IMessenger。显然,注入是由IoC容器执行的。
应用层不应该知道基础结构层。
这是一个很好的页面,可以看到这种设计:Hexagonal Architecture。