gpt4 book ai didi

c# - 依赖注入(inject) : should I completely hide implementation and take a dependency on the container or keep my implementation and constructor public

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:34 24 4
gpt4 key购买 nike

我有一个包含 3 个 dll(web.dll、businesslogic.dll 和 services.dll)的应用程序。 Web 应用实例化使用服务的业务逻辑对象。所有服务都“隐藏”在接口(interface)后面,我使用 autofac 将这些实现注入(inject)业务逻辑对象。这里没什么特别的。

我试图通过将我的服务接口(interface)公开但通过将它们设为内部来隐藏我的类型的实现来为我的应用程序创建更好的封装。使用 Autofac 自动注册,它工作得很好,除非构造函数有一些值类型参数,如连接字符串。我有 3 个备选方案,每个备选方案各有利弊,所以我想知道哪一个被认为是最好的:

  1. 用接口(interface)(例如:IMyServiceConfigurations)替换我所有的值参数,这很好用,但创建了很多 1 属性接口(interface)和实现,这些接口(interface)和实现有点混淆了构造函数

  2. 将 autofac 模块中的注册放入我的服务 dll 中。这样做,我在我不太喜欢的服务 dll 中依赖 Autofac。我更喜欢只有应用程序(网络应用程序)的根依赖于容器

  3. 使用 NamedParameter 或 TypedParameter 但为此,应用程序的根需要知道将使用的构造函数(和实现),因此封装以另一种方式被破坏。

关于如何在不将实现泄漏到服务 dll 之外的情况下实现这一点的任何想法或评论。

谢谢。

最佳答案

I'm trying to create a better encapsulation for my app by making the interfaces of my services public but hiding the implementation of my types by making them internal

考虑到封装,将类设为内部不会改变任何内容。由于您的组件依赖于抽象,因此从消费者的角度来看,封装没有区别。他们仍然不知道实现的存在。当您将实现移动到消费者不依赖的其他程序集时,这可能会被夸大。通过这种方式,实现可以保持公开,而消费者无法直接使用它。

除此之外,即使实现是公开的,它通常仍会通过将所有内容都设置为内部来保护其不变量,除了由它实现的接口(interface)公开的部分。这意味着它仍在应用封装,即使它是公开的。

在业务线应用程序中,通过内部实现通常不会获得任何好处。您的应用程序之外没有人会尝试使用这些类型。不过,这些实现有两个消费者。这些消费者是您的单元测试和应用程序的 composition root .对于他们两者来说,如果您将它们放在内部,只会让您的工作更加困难。

重新考虑公开这些类型。

关于c# - 依赖注入(inject) : should I completely hide implementation and take a dependency on the container or keep my implementation and constructor public,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40324624/

24 4 0