【问题标题】:Architectural Design to avoid circular dependency避免循环依赖的架构设计
【发布时间】:2014-05-14 05:12:16
【问题描述】:

我有一个 Adaptor 可以找到 Sources 并返回它。但我需要保留适配器及其所有来源的参考。但是这种设计会产生循环依赖。

IAdaptor需要一个返回ISource列表的函数,每个ISource都需要保留一个自己的Adaptor的引用

ISource 保存在 Project 1 中,IAdaptor 保存在 Project 2 中

如何在不相互创建循环依赖的情况下做到这一点?

【问题讨论】:

  • 在第三个程序集中定义公共接口并在实现程序集中引用它。除此之外,您可能需要使用某种dependency injection。考虑使用IoC container,例如MEF
  • 看起来 IAdaptor 和 ISource 确实是紧密耦合的。如果它反映了您的商业模式,只需将它们保存在单个项目中即可。
  • 你能澄清一下你的意思是:一个实际的程序集引用循环依赖吗?或者,如果您的意思是类型本身内的循环引用?
  • 您的 Source 需要您的 Adaptor 提供什么?
  • 如果您要求源做某事,它会告诉其适配器为它做这件事。

标签: c# circular-dependency


【解决方案1】:

我建议您看看 ISource 真正需要 IAdaptor 提供哪些功能:IAdaptor 上的哪些方法是从 ISource 实现中调用的,这些方法是否真的与 IAdaptor 相关联。

在某些情况下,将这些功能从 IAdaptor 中移出作为一个单独且更通用的接口(我将其称为 ISourceDependency)并将其放在 ISource 的同一程序集中可能是合适的。 ISource 将依赖于 ISourceDependency 而不是 IAdaptor,因此循环依赖被移除。那么你只需要让适配器在 IAdaptor 之外实现 ISourceDependency 即可。

如果您发现 ISourceDependency 上的方法确实与 IAdapter 的逻辑绑定,那么最好将 IAdapter 放在与 ISource 相同的程序集中。

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2017-11-19
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多