Where do interfaces belong in a multitier application
假设您有一个三层的应用程序,它为一个简单的应用程序提供了三层UI、服务和存储库,让我们假设保存地址。
如果AddressService具有接口IAddressService,那么该接口属于哪里?我知道"在地址服务中"似乎是一个显而易见的答案,但是如果它在地址服务中,那么它似乎会破坏拥有接口的点,这样只要实现了IAddressService,任何服务库都可以被交换。
(具体来说,这是在.NET问题空间中,但它可能更通用,所以它是标记的体系结构)
地址服务程序集是它的正确位置。
if it's in the address service it
would seem to defeat the point of
having the interface such that any
service library could be swapped in as
long as it implemented IAddressService
接口的要点是允许调用者在备用实现中交换。提供一个具体的实现(或者多个实现,就这点而言)根本不会干扰到这一点。
唯一一次我要做一个只包含接口的程序集是在我不提供任何实现的时候。
把它们放在一个单独的组件中,像
我使用将服务接口放在一个程序集中,而将实现放在另一个程序集中。我从来没有在.NET中需要过它,但我还是这样做了,我认为这是一种将UI"或其他API客户机)与服务实现分离的方法。
我需要在Java项目中进行这种分离,其中Applet必须调用Web服务;因此,只有具有接口的jar才被发送到浏览器。如果jar还包含实现,那么它将是一个很重的applet。
我倾向于将它们放在子名称空间/目录下的相关程序集中。
例如,如果我有一个客户程序集,那么ICustomerRepository或ICustomerAddressRepository等将处于
..customers.interfaces.icustomerrepository