这里是一个非常热门的概念: Ioc (控制反转)。我已经使用这个概念有一段时间了。通常我采用 DI(而不是服务定位器)方法在我的代码中实现 IoC。以下是我对 IoC 的理解。
如果ClassA依赖于ClassB,如果它在内部声明了ClassB的实例,那么它就依赖于ClassB,出于某种原因(稍后会讲到),这并不好,因此我们使用DI来解决这个问题。所以现在我们有一个叫IClassB的接口,将在ClassA的构造函数中传递(这里采用构造函数注入进行说明)。下面是代码:
我已经展示了以上示例,只是为了确保我对IoC和DI的理解正确。如果您发现有什么错误,请纠正我。 现在,在我试图找出为什么需要IoC时,我发现两个重要原因:
IoC如何帮助解决由于ClassB方法的更改而导致的任何问题?如果方法签名发生变更,我们还必须在接口IClassB的方法签名中进行修改(这实际上增加了重构任务)。如果方法实现发生更改,例如它需要执行附加的日志记录任务,那么更改将仅限于ClassB代码。
除了单元测试可能会受益之外,有人可以提供一个情景吗?
非常感谢您阅读此内容。
如果ClassA依赖于ClassB,如果它在内部声明了ClassB的实例,那么它就依赖于ClassB,出于某种原因(稍后会讲到),这并不好,因此我们使用DI来解决这个问题。所以现在我们有一个叫IClassB的接口,将在ClassA的构造函数中传递(这里采用构造函数注入进行说明)。下面是代码:
public class ClassA
{
IClassB _classBObj = null;
public ClassA(IClassB classBObj)
{
_classBObj = classBObj;
}
public void UseClassBMethod()
{
this._classBObj.classBMethod();
}
}
public class ClassB:IClassB
{
public void classBMethod()
{
//Some task carried out by classB.
}
}
public interface IClassB
{
void classBMethod();
}
以下是让它运行的代码:
class Program
{
static void Main(string[] args)
{
//This code is outside of class A and hence declaring
//object of ClassB is not dependency
ClassA classA=new ClassA(new ClassB);
classA.UseClassBMethod();
}
}
我已经展示了以上示例,只是为了确保我对IoC和DI的理解正确。如果您发现有什么错误,请纠正我。 现在,在我试图找出为什么需要IoC时,我发现两个重要原因:
可测试性:这肯定是一个正确的关注点。比如,在上面的示例中,classB方法使用SMPTP服务器或某个WCF / Webservice,我们可能无法对其进行测试。但是,我们可以创建一个实现接口IClassB的测试存根类,并通过传递测试存根类的实例来继续进行测试。
以具体实现为依赖:这是我无法理解的地方。即使我使用以下代码更改classA的代码:
public class ClassA
{
ClassB _classBObj = null;
public ClassA()
{
_classBObj = new ClassB();
}
public void UseClassBMethod()
{
this._classBObj.classBMethod();
}
}
IoC如何帮助解决由于ClassB方法的更改而导致的任何问题?如果方法签名发生变更,我们还必须在接口IClassB的方法签名中进行修改(这实际上增加了重构任务)。如果方法实现发生更改,例如它需要执行附加的日志记录任务,那么更改将仅限于ClassB代码。
除了单元测试可能会受益之外,有人可以提供一个情景吗?
非常感谢您阅读此内容。