![]() |
1
7
尽管有些争议:是的,这是一种反模式。它被称为 服务定位器 虽然有些人认为它是一个合适的设计模式,但我认为它是一个反模式。 这个问题是,例如,您的useraccounts类的用法 隐性的 而不是 明确的 . 虽然构造器声明它需要IDependencyResolver,但它没有声明应该包含什么。如果传递给它的IDependencyResolver无法解析isomeType,它将抛出。 更糟糕的是,在以后的迭代中,您可能会尝试解决一些 其他类型 从用户帐户中。它将编译得很好,但如果/当类型无法解析时,它可能会在运行时抛出。 别走那条路。 根据给出的信息,不可能确切地告诉您应该如何用循环依赖性解决特定的问题,但我建议您重新考虑您的设计。在许多情况下,循环引用是 泄漏的抽象 因此,如果您对API进行一点改造,它可能会消失——通常令人惊讶的是,所需的更改非常小。 一般来说,任何问题的解决方案都是添加另一个间接层。如果您确实需要两个库中的对象紧密协作,那么通常可以引入一个中间代理。
|
![]() |
2
2
我同意Foreverdebugging——消除循环依赖性会很好。看看您是否可以这样划分类:
然后有一个程序集引用其他两个程序集,但没有依赖关系圈。
如果程序集之间确实存在循环依赖关系,则不一定意味着类之间存在循环依赖关系。例如,假设您有这些依赖项:
假设没有其他依赖项。 这里有一个程序集循环,这些程序集在运行时在应用程序中相互依赖(尽管它们在编译时并不相互依赖,因为它们通过共享的DLL)。但在编译时或运行时,没有相互依赖的类循环。 在这种情况下,您应该仍然能够正常使用IOC容器,而不需要添加额外的间接级别。在mymodule中,只需将每个接口绑定到适当的具体类型。使每个类接受其依赖项作为构造函数的参数。当顶级应用程序代码需要类的实例时,让它向IOC容器请求该类。让IOC容器担心查找类所依赖的所有内容。
通常IOC容器使用构造函数注入-它们将依赖项传递给依赖它们的类的构造函数。但当存在循环依赖时,这不起作用。如果类A和类B相互依赖,则需要将类A的实例传递给类B的构造函数。但是,为了创建A,需要将类B的实例传递给它的构造函数。这是鸡和蛋的问题。 通过属性注入,您告诉IOC容器首先调用构造函数,然后在构造的对象上设置属性。通常,这用于可选的依赖项,如记录器。但您也可以使用它来打破两个相互需要的类之间的循环依赖关系。 但这并不是很好,我绝对建议重构类以消除循环依赖性。 |
![]() |
3
1
这对我来说确实有点奇怪。是否可以将需要两个引用的逻辑分离到第三个程序集中,以打破依赖关系并避免风险? |
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |