2016-10-18 76 views
0

考虑我有一个应用程序使用三个库,lib1,lib2和lib3。在每个库中,我都实现了一个Module,它注册了该库中实现的依赖关系。Autofac模块应该注册自己的从属模块吗?

其中一些实现有它们自己的依赖关系,例如,lib2和lib3可能都需要lib1中存在的某些实现。

我的问题是,我是否让lib2和lib3中的模块在lib1中将模块注册为Load实现的一部分?如果我的应用程序注册了lib2和lib3的模块,是否会注册该模块两次?

还是我不会让模块注册另一个模块,让它上升到应用程序,缺点是启动时可能缺少一些注册?

+0

这个问题不是关于库是否注册自己的注册是否可行。他们不。他们只是提供一个外观来帮助注册这些依赖项,以供组合根使用。 –

回答

0

一个Autofac Module只不过是一个外观,以帮助注册组件。它不应该调用其他模块来注册已知是自己注册依赖项的实现,因为这会将两个模块绑定在一起,从而增加耦合性。

此外,如果同一个模块被多次注册,注册本身将被多次应用,因为Autofac不会跟踪已经注册的模块。这通常不会造成问题,除非组合根无意中取消了任何旨在覆盖现有注册的注册。

1

通常,应该只有一个包含配置的库。这个库是启动项目,这个地方在所有连接的应用程序中通常被称为Composition Root。通常,只有启动项目才具有组合根,并且只有当单个解决方案中的多个启动项目共享大量重复注册时,才会开始将此代码提取到可供这些组合根重用的通用位置。但要小心:一般Composition Roots should not be reused

+0

当然,但我没有重用组合的根源。我正在重复使用创建的外墙,以便更容易地在库中注册内容。 –

1

我不会推荐在您的图书馆内进行注册。在大多数情况下,您应该有一个组成所有应用程序的组合根。

组合根是一个(最好)在模块组合在一起的应用程序中的唯一位置。

这个概念在这里解释composition root

顺便说一句,如果您多次注册一个模块,Autofac将注册组件multipe时间。如果您的库中必须有模块,则只应创建库的注册组件模块。

+0

嗯,我有多个组合根,一个用于解决方案中的每个应用程序。当然,我不需要重写所有的注册码?如果是这样,拥有模块有什么意义? –

+0

模块可以帮助您组织注册。它还允许您附加已经注册的组件或注册源以修改注册行为。有关* Autofac *模块的更多信息,请参见http://docs.autofac.org/en/latest/configuration/modules.html –