【问题标题】:Dependency Injection - Loosely coupled code - Interfaces依赖注入 - 松耦合代码 - 接口
【发布时间】:2013-12-19 08:26:04
【问题描述】:

我最近正在尝试处理 DI。 如果到目前为止我理解正确,主要目的是编写松散耦合的代码,以促进可重用性。 (另见https://stackoverflow.com/a/9503612/579740

到目前为止一切都很好,但我仍然不完全清楚的一件事是放置接口的位置。

一个例子能说出一千多个单词:

库 A:

public class A
{
    public A(IInterfaceB b)
    {}
}

库 B:

public interface IInterfaceB
{}

public class B : IInterfaceB
{
    public B (IInterfaceC c)
    {}
}

库 C:

public interface IInterfaceC
{}

public class C : IInterfaceC
{
    public C()
    {}
}

如果我将 IInterfaceC 放在库 C 中,我仍然在库 B 中引用了库 C。 所以当我决定重用B库时,我还需要C库??? 至少在我看来,这似乎不是松散耦合的......

有人可以向我解释我的想法哪里出错了吗?

【问题讨论】:

    标签: interface dependency-injection


    【解决方案1】:
    1. 松散耦合的代码并不总是意味着松散耦合的模块(库)。
    2. 您可以通过将接口和实现放在不同的模块中来实现模块(库)的松散耦合。例如 A 类在 A.dll 中,IInterfaceB 在 IInterfaceB.dll 中(A.dll 引用它),B 类在 B.dll 中(它也引用 IInterfaceB.dll)

    看起来像下面 class A -> IInterfaceB <- class B 因此包含 A 类和 B 类的模块不会耦合。

    【讨论】:

    • 1) 解释了我的想法哪里出了问题,但是如果模块仍然紧密耦合,我仍然不明白可重用性的想法来自哪里。而且我考虑过 2) 但是将每个接口放在自己的 dll 中感觉不对。
    • 您不应该将每个接口放在单独的 dll 中。你应该考虑层次。并且每一层都应该有自己的 SomeLayer.Contracts.dll(带有接口、异常和数据传输对象)和 SomeLayer.Implementation.dll(带有具体的接口实现)。你可以在这里深入了解它 - objectmentor.com/resources/articles/dip.pdf
    • 这更有意义 :-) 我想我必须在脑海中对这个 DI 的东西进行转换,因为我必须在我的 GUI 中重新引用每个项目(其中 [this](@ 987654322@) 帮了大忙。
    • @OleksandrKobylianskyi - 该 PDF 链接已失效。 :*(
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多