Autofac模块在N层架构中的应用

9

目前我正在使用 Autofac 进行 IoC。在两个组合根 (一个用于前端,一个用于后端) 中,我注册并解析跨越 Service Business Data 层的组件。

到目前为止,我的单一模块名称为“AccountingModule”。现在我要向应用程序中添加几个新模块,名称类似于 InventoryModule,...

我的问题是,我应该将每个模块的类分别分布在各层中(方案1),还是每个模块都有独立的所有层(方案2)?

方案1:

Service Layer

(AccountingMoudle, InventoryModule, ...)

Business Layer

(AccountingMoudle, InventoryModule, ...)

Data Layer

(AccountingModule, InventoryModule, ...)

或者

解决方案2:

AccountingModule
(
 Service Layer,
 Business Layer,
 Data Layer
)

InventoryModule
(
 Service Layer,
 Business Layer,
 Data Layer
)

Edit 1

+-----------------------------+                              +----------------------------+
+--+AccountingServiceComponent                               +-+InventoryServiceComponent
|                                      Weak Dependency       |
+--+AccountingBusinessComponent      <------------------+    +-+InventoryBusinessComponent
|                                                            |
+--+AccountingDataComponent                                  +-+InventoryDataComponent
       +                                                         +
       +-+ GetDocumentByID(int id)                               +--+GetProductByID(int id)
       |                                                         |
       +-+ SaveDocument(Document d)                              +--+SaveProduct(Product p)

Edit 2 Architecture:

enter image description here


5
每个终端应用程序应该只有一个组合根。在您的情况下,您似乎只有一个终端应用程序,因此应该只有一个组合根。 - Steven
相关链接:https://dev59.com/oWkx5IYBdhLWcg3wAvqn - Steven
2个回答

4
目前我正在使用Autofac进行IoC,有两个组合根(一个用于前端,另一个用于后端)。
我理解这只是一个应用程序,它具有前端和后端部分。首先,您应该有一个组合根,否则您的设计将在某些时候失败。无论您有哪种解决方案,都没有关系。
假设它们是两个不同的驱动程序应用程序(例如Web服务和网站)。
我的问题是,我应该将每个模块类分别分配到各个层中(解决方案1),还是为每个模块单独拥有所有层(解决方案2)?
编辑:实际上,您的问题是“水平(解决方案1)或垂直(解决方案2)切片更好?”(从将应用程序分区为模块)。
这篇Horizontal vs Vertical slicing文章解释得很好。它说:
当有可能时,请垂直切割。当你必须时去水平。
这是另一篇好的文章
在您进行编辑之后,我发现您已经将模块实现为垂直的,因此继续垂直(解决方案2)。

假设 A 和 B 是我们的模块,您能否说一下它与解决方案1有何不同?在我的解决方案1中,给定模块的不同部分放置在各自的层中,并按照标准的服务、业务、数据顺序进行访问。 - Mohsen Afshin
我添加了一个类的图示。我对你回答中模块的含义表示怀疑。这里所说的模块是指一组相关的类,它们之间具有强依赖关系,并且与应用程序的其他部分之间具有较弱的依赖关系。在我的图表中只有两个模块,实际上可能会有10个或更多的模块。 - Mohsen Afshin
我已经完成了所提出的图表。现在就Autofac而言,我应该将子域(InventoryUIComponent、InventoryServiceComponent、InventoryBusinessComponent、InventoryDataComponent)的所有子层注册为单个InventoryModule吗?未来可能会有更多这样的子域,并且其中大部分可能对最终用户是可选的。 - Mohsen Afshin
你已经回答了自己的问题。有些最终应用程序可能不使用这些实现,或者它们使用其他实现。即使是水平或垂直设计,你的类也不应该耦合(只耦合接口而不是实现)。在这里查看:https://dev59.com/oWkx5IYBdhLWcg3wAvqn#9503612 - Erkan Demirel

1

您不应该尝试将Autofac模块移动到库中,您可能正试图做同样的事情,这也是您首先提出此问题的原因。

如果您有多个组成根,则应在每个组成根中创建模块。不同的组成根可能使用不同的模块。此外,您可能不想将Autofac添加为解决方案中每个库的引用。.

我的问题是我应该将每个模块类分配到层中(方案1),还是为每个模块单独设置所有层(方案2)

这取决于注册数量,如果非常少,则可以仅使用AccountingModuleInventoryModule

如果会计中有很多注册,但库存很少,那么您可以使用AccountingServiceModule,AccountingBusinessModule,AccountingDataModule InventoryModule。您可以从应用程序的每个子域(库存,帐户等)开始一个模块,并根据需要拆分它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接