.net 组件的松耦合

.net 组件的松耦合,.net,oop,architecture,.net,Oop,Architecture,我创建了一个类库(程序集),它提供消息、电子邮件和sms。这个类库定义了一个接口IMessenger,类EmailMessage和SmsMessage都实现了这个接口 我看到这是一个通用库,它将是我的基础架构层的一部分,并且将/可以在任何开发中使用 现在,在我的应用层中,我有一个类需要使用消息传递组件,我显然希望使用我创建的消息传递库。此外,我将使用一个IoC容器(Spring.net)来允许我注入我的实现,即电子邮件或sms 因此,我想针对我的应用层类中的接口编程,那么我是否需要从我的应用层类

我创建了一个类库(程序集),它提供消息、电子邮件和sms。这个类库定义了一个接口IMessenger,类EmailMessage和SmsMessage都实现了这个接口

我看到这是一个通用库,它将是我的基础架构层的一部分,并且将/可以在任何开发中使用

现在,在我的应用层中,我有一个类需要使用消息传递组件,我显然希望使用我创建的消息传递库。此外,我将使用一个IoC容器(Spring.net)来允许我注入我的实现,即电子邮件或sms

因此,我想针对我的应用层类中的接口编程,那么我是否需要从我的应用层类引用我的消息类库

这是否将我的应用层类与消息类库紧密耦合

我应该在单独的库中定义接口-IMessenger吗


还是我应该做些别的事情?

这取决于你对IMessenger未来的计划。就我个人而言,我并不认为在同一个程序集中有接口和几个示例实现是一件坏事。如果有人想提供IMessenger的新实现,他们必须在另一个程序集中完成,并且在引入您的程序集的过程中,他们将收到EmailMessage、SmsMessage等。对于轻量级程序集,我认为这不是什么大问题,因为这样可以节省您同时引用“接口”和“实现”的工作量每次要使用一个程序集时,都要使用一个程序集


如果您的实现类引用了与您的组织相关的其他代码或任何您不想公开的代码,那么将IMessenger分离到它自己的程序集中并根据需要分发它将更有意义。

引用(以及耦合)没有错误将应用程序层类添加到消息库。只要您的消息库是独立的,并且不知道它的用户,就可以了


此外,不要仅仅因为建筑的事实而过度设计。它应该有一个目的,而且收益应该大于成本。

我对您的问题的回答:

  • “因此,我想针对我的应用层类中的接口编程,那么我是否需要从我的应用层类引用我的消息类库?”否

  • “这是否将我的应用层类与消息类库紧密耦合?”是的

  • “我应该在单独的库中定义接口-IMessenger吗?”是的

如果您使用的是IoC容器,请插入依赖项,不要将应用程序与基础结构实现耦合

我的实现是将IMessenger接口放在应用程序层,以便允许我的应用程序对象与接口对话,而不管接口的实现如何。我将在一个单独的组件中发送普通电子邮件和SMS,它们实现IMessenger。显然,注入是由IoC容器执行的

应用层不应该知道基础结构层


这是一个很好的页面,可以看到这种设计:。

您如何对轻质组件进行分类?根据它的物理大小(字节),如果是的话,什么是轻量级的?本质上是物理大小或类的数量。我的意思是,如果你在很多应用程序中使用这个程序集,最好不要引入很多不相关的业务对象、数据访问类等。但听起来这将是一个独立的库,你可以在很多项目中使用。您的问题应该是,“我想让每个需要iMessage的人都知道EmailMessage和SMSMMessage[并因此包括它们],还是用户能够在不知道现有实现的情况下实现iMessage?[使用两个单独的程序集].我很高兴你这么做:)因为归根结底,这就是它的全部。我不同意。这是一个紧密耦合,这是不好的。同样重要的是,你的应用程序不知道它的合作者的实现。它不是过度设计,它们只是很好的设计原则。谢谢你的回答。如果IMessenger在应用层难道这不意味着提供实现的程序集必须引用定义IMessenger接口的应用层中的程序集吗?@David:是的,具有实现的程序集必须引用公开IMessenger的程序集。依赖关系是反向的(应用程序层不知道基础架构的内容),这些实现应该由Spring.net来解决。这基本上意味着如果不引用它,IMessenger实现就不能在其他应用程序中重用application@Maxim盖伊万多夫:你说得对。你可以把IMessenger放在一个单独的程序集中,让应用层和IMessenger实现引用这个程序集。