我在研究类之间的高耦合,特别是IoC。 我想问一些问题:关于IoC的问题
- 我正在使用Ninject;哪一层我应该把dll Ninject
- 当我创建一个设置发送到客户端时,dll Ninject也会去找客户吗?
- 我一直在研究互联网,得出如下结论: a。控制反转是当我改变我的类,并且我没有在他们自己的类中实例化它们,而是作为参数或使用Ninject b。依赖注入是当我添加到我的项目接口而不是具体的类。
我在研究类之间的高耦合,特别是IoC。 我想问一些问题:关于IoC的问题
Ad2。您必须将ninject dll添加到您的设置中。
Ad3。控制反转(IoC)与接口和类无关。您可以使用高度耦合的代码来控制反转。
class GodClass
{
void DoSth(int param)
{
switch (param)
{
case 0: Console.WriteLine("param is 0"); break;
case 1: Console.WriteLine("param is 1"); break;
}
}
}
,并与国际奥委会它可能看起来像:
class GoodClass
{
Dictionary<int, BaseClass> _consoleWriters;
public GoodClass(IEnumerable<BaseClass> writers)
{
foreach (var writer in writers)
_consoleWriters.Add(writer.ParamSupported, writer);
}
void DoSth(int param)
{
_consoleWriters[ param ].DoSth();
}
}
abstract class BaseClass
{
abstract int ParamSupported {get;}
abstract void DoSth(int param);
}
class ZeroWriter : BaseClass
{
override int ParamSupported {get{return 0;}}
override DoSth(int param) { Console.WriteLine("param is 0"); }
}
class OneWriter : BaseClass
{
override int ParamSupported {get{return 1;}}
override DoSth(int param) { Console.WriteLine("param is 1"); }
}
广告1。我将在Main函数中添加IoC框架配置/初始化,并将引用初始化容器传递给其余代码。
IoC的概念与建筑图层的概念是正交的。每当您使用Ninject功能(例如[Inject]
属性(通常在注入类的级别)或(b)无论您设置内核和模块(通常在客户端级别))时,您都必须参考Ninject(a)。
是的。 Ninject将成为运行时的依赖。
国际奥委会可能会出现这些行为,但其核心概念可能会被更好地理解为Holywood principle:不要打电话给我们,我们会打电话给你。这意味着,不要打扰建立你的依赖关系,因为它们将为你提供。尽管Ninject等工具可以极大地缓解您的生活,但您可以通过多种方式达到此目的,即使是“手动”。无论如何,通过参数接收依赖对象(主要是在对象构造期间)是一种非常常见的模式,因为它通过接口而不是类来定义依赖关系。
使用接口可以帮助你从实现建立合同,以更好地分开的要求(这是摆在首位应用的IoC驱动的原因)。另外,它可以帮助你编写测试和模拟。但那是另一个可能性的世界。玩的开心!我已经使用Ninject将近一年了,而且我发现它非常易于使用和维护。
关于依赖注入......根据您所说的语言,这可能不是真的。在C#/ VB.NET的情况下,是的。在JavaScript,Ruby等动态语言中并非如此。我想现在,如果你使用的是DynamicObject,它也可能是错误的。通过指定你的类依赖于一个接口而不是一个具体的类,你可以手动地或通过使用像Ninject这样的IoC容器轻松地注入该接口的不同实现。
On Inversion of Control ...它基本上是说不是调用类/方法创建其他组件需要执行其工作,而是让它在别处创建并传递给您的类/方法。打破这个具体的依赖关系链将使你的代码更加松散耦合,并允许你用一个实现了相同接口/契约的不同组件来替换所需组件的一个实现。
上依赖倒置原则/ IOC一个很好的解释,可http://www.objectmentor.com/resources/articles/dip.pdf找到。
这个主题其他好的资源:
谢谢! 我会继续学习。 – ridermansb 2011-02-18 18:27:46