Architecture 在多层应用程序中,接口属于何处

Architecture 在多层应用程序中,接口属于何处,architecture,Architecture,所以,假设您有一个三层应用程序,其中包含一个简单应用程序的UI、服务和存储库,比如保存地址 如果AddressService有一个接口,那么该接口属于哪里?我知道“在地址服务中”似乎是一个显而易见的答案,但如果它在地址服务中,那么它似乎就无法实现接口,只要它实现了服务,任何服务库都可以被交换 (特别是在.net问题空间中,但它可能更通用,因此它是标记的体系结构)将它们放在单独的程序集中,如AddressService.Interface或AddressService.Contracts,这是所有

所以,假设您有一个三层应用程序,其中包含一个简单应用程序的UI、服务和存储库,比如保存地址

如果AddressService有一个接口,那么该接口属于哪里?我知道“在地址服务中”似乎是一个显而易见的答案,但如果它在地址服务中,那么它似乎就无法实现接口,只要它实现了服务,任何服务库都可以被交换


(特别是在.net问题空间中,但它可能更通用,因此它是标记的体系结构)

将它们放在单独的程序集中,如
AddressService.Interface
AddressService.Contracts
,这是所有三层共享的。

我倾向于将它们放在子命名空间/目录下的相关程序集中

例如,如果我有一个客户程序集,那么ICCustomerRepository或ICCustomerAddressRepository等将被关闭


…Customers.Interfaces.icCustomerRepository

地址服务程序集是它的正确位置

如果它在地址服务中 似乎会挫败这一点 具有接口,使得任何 服务库可以作为 只要它实现了一个新的服务

接口的要点是允许调用方在替代实现中进行交换。提供一个具体的实现(或者多个实现)根本不会影响这一点


只有在我不提供任何实现的情况下,我才会创建一个只包含接口的程序集。

我通常将服务接口放在一个程序集中,将实现放在另一个程序集中。在.NET中我从来都不需要它,但我还是这样做了,我认为这是一种将UI(或其他API客户端)与服务实现分离的方法


我在一个Java项目中需要这种分离,在这个项目中,小程序必须调用web服务;因此,只有带有接口的jar被发送到浏览器。如果jar也包含了实现,它将是一个沉重的小程序。

这不是(先发制人的)吗对于大多数单团队项目来说,创建接口是多余的,因为您可能会将接口的创建推迟到需要时,或者事后的实施成本是否明显高于我看到的查找替换?这取决于您所说的“需要接口”是什么意思。(实际上,这并不是使用单个程序集的结果。)通常有很好的理由为接口而不是具体对象编写代码:请参见、和,所有这些都提供了可靠的信息,并涵盖了关于它的各种观点。