我想我对依赖反转原理(DIP)有一个很好的理解,我的困惑更多的是关于依赖注入。
我的理解是DI的全部目的是将应用程序的各个部分解耦,允许一个部分中的更改而不影响另一个部分,前提是接口不会改变。
举个例子,我们有
public class MyClass(IMyInterface interface)
{
public MyClass
{
interface.DoSomething();
}
}
public interface IMyInterface
{
void DoSomething();
}这怎么回事
var iocContainer = new UnityContainer();
iocContainer.Resolve<MyClass>();比做这个更好的练习
//if multiple implementations are possible, could use a factory here.
IMyInterface interface = new InterfaceImplementation();
var myClass = new MyClass(interface);这可能是我错过了一个非常重要的点,但我没有看到什么是得到的。我知道使用IOC容器可以轻松地处理对象的生命周期,这是一个+1,但我不认为它是IOC的核心。
编辑
下面是一个扩展的示例:
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);
}
}发布于 2013-06-29 17:19:25
在你的例子中,你什么也没有得到。你的直觉是正确的。如果只有一个类实现了一个接口,那么就没有好处了,因为它可能总是这样。我们可以在多大程度上添加接口并使代码混乱,这是没有限制的。
发布于 2013-06-29 21:31:08
最好是通过接口的实现。真正的好处来自于更复杂的例子。如果创建是由运行时行为决定的,会发生什么?通过工厂而不是实例解决了这一问题,但可能会变得不奇怪。如果创建时间框架不明确,怎么办(消费类不能仅仅调用工厂,而是必须等到设置好所有内容)。
此外,当您正在实例化的类也不是具体版本时,会发生什么呢?如果您所需要的只是一个IFoo,那么某个工厂正在提供该实现。一些具体的实现需要注入一些依赖项,而另一些则需要(或不需要)。
IoC容器是一个巨大的锤子。通常,只是通过一个接口的具体实现是明确的,功能的,灵活的。但是,有时设计变得非常复杂,以至于您需要IoC容器来管理分布在对象图中的依赖关系的混乱。
发布于 2013-10-07 23:09:42
使用DI容器作为服务定位器实际上是一种反模式,它被广泛讨论.有时你必须这样做,但一般来说,你应该避免这样做。基本上,通过调用container.Resolve,您没有执行任何IoC,而IoC正是DI容器的意图。
我们真正使用DI容器的是在需要时使用custructor参数或属性注入注入依赖项。在应用程序初始化/启动并在那里指定所有细节时,您可以提前注册实现接口的类--简单初始化、使用参数、使用工厂等,以及指定生命范围等。当所有这些都完成之后,只要构造器有参数,只要构造函数有参数,注册的类就会被注入其中。所以当你这么做的时候
当然,您必须使用引导程序来解析您的主应用程序类,但是由于这个类已经注入了参数,所以所有其他类都可以自动运行。如果您需要ISession、ICustomerRepository或IWhatEverElseYouNeed,您将不必担心每次需要它时都会实例化它。
https://softwareengineering.stackexchange.com/questions/203146
复制相似问题