首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >依赖注入混淆

依赖注入混淆
EN

Software Engineering用户
提问于 2013-06-29 08:48:14
回答 4查看 22.5K关注 0票数 7

我想我对依赖反转原理(DIP)有一个很好的理解,我的困惑更多的是关于依赖注入。

我的理解是DI的全部目的是将应用程序的各个部分解耦,允许一个部分中的更改而不影响另一个部分,前提是接口不会改变。

举个例子,我们有

代码语言:javascript
复制
public class MyClass(IMyInterface interface)
{
   public MyClass
   {
      interface.DoSomething();
   }
}

public interface IMyInterface
{
    void DoSomething();
}

这怎么回事

代码语言:javascript
复制
var iocContainer = new UnityContainer();
iocContainer.Resolve<MyClass>();

比做这个更好的练习

代码语言:javascript
复制
//if multiple implementations are possible, could use a factory here.

IMyInterface interface = new InterfaceImplementation();
var myClass  = new MyClass(interface);

这可能是我错过了一个非常重要的点,但我没有看到什么是得到的。我知道使用IOC容器可以轻松地处理对象的生命周期,这是一个+1,但我不认为它是IOC的核心。

编辑

下面是一个扩展的示例:

代码语言:javascript
复制
void Main()
{
    IRepository repository = new AddRepository();
    var maths = new PointlessMaths(repository,5);
    Console.WriteLine(maths.Result);
}

public interface IRepository
{
    int DoSomething(int id);    
}

public class AddRepository : IRepository
{
    public int DoSomething(int id)
    {
        return id + 1;
    }
}

public class SubtractRepository : IRepository
{
    public int DoSomething(int id)
    {
        return id - 1;
    }
}

public class PointlessMaths
{
    public int Result {get;set;}
    public PointlessMaths(IRepository repository, int id)
    {
        Result = repository.DoSomething(id);        
    }
}
EN

回答 4

Software Engineering用户

回答已采纳

发布于 2013-06-29 17:19:25

在你的例子中,你什么也没有得到。你的直觉是正确的。如果只有一个类实现了一个接口,那么就没有好处了,因为它可能总是这样。我们可以在多大程度上添加接口并使代码混乱,这是没有限制的。

票数 8
EN

Software Engineering用户

发布于 2013-06-29 21:31:08

最好是通过接口的实现。真正的好处来自于更复杂的例子。如果创建是由运行时行为决定的,会发生什么?通过工厂而不是实例解决了这一问题,但可能会变得不奇怪。如果创建时间框架不明确,怎么办(消费类不能仅仅调用工厂,而是必须等到设置好所有内容)。

此外,当您正在实例化的类也不是具体版本时,会发生什么呢?如果您所需要的只是一个IFoo,那么某个工厂正在提供该实现。一些具体的实现需要注入一些依赖项,而另一些则需要(或不需要)。

IoC容器是一个巨大的锤子。通常,只是通过一个接口的具体实现是明确的,功能的,灵活的。但是,有时设计变得非常复杂,以至于您需要IoC容器来管理分布在对象图中的依赖关系的混乱。

票数 2
EN

Software Engineering用户

发布于 2013-10-07 23:09:42

使用DI容器作为服务定位器实际上是一种反模式,它被广泛讨论.有时你必须这样做,但一般来说,你应该避免这样做。基本上,通过调用container.Resolve,您没有执行任何IoC,而IoC正是DI容器的意图。

我们真正使用DI容器的是在需要时使用custructor参数或属性注入注入依赖项。在应用程序初始化/启动并在那里指定所有细节时,您可以提前注册实现接口的类--简单初始化、使用参数、使用工厂等,以及指定生命范围等。当所有这些都完成之后,只要构造器有参数,只要构造函数有参数,注册的类就会被注入其中。所以当你这么做的时候

当然,您必须使用引导程序来解析您的主应用程序类,但是由于这个类已经注入了参数,所以所有其他类都可以自动运行。如果您需要ISession、ICustomerRepository或IWhatEverElseYouNeed,您将不必担心每次需要它时都会实例化它。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/203146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档