我正在研究类之间的高耦合,特别是IoC。 我想问一些问题:
答案 0 :(得分:2)
IoC的概念与架构层的概念是正交的。每当您使用Ninject功能(例如[Inject]
属性(通常在注入类的级别))或(b)无论您在何处设置内核和模块(通常在客户端级别),都必须引用Ninject(a)
是。 Ninject将成为运行时的依赖项。
IoC可能会呈现这些行为,但其核心概念可能会被更好地理解为 Holywood principle :不要打电话给我们,我们会打电话给你。这意味着,不要费心设置您的依赖项,因为它们将为您提供。您可以通过多种方式实现这一目标,即使是“手动”,尽管像Ninject这样的工具可以极大地缓解您的生活。无论如何,通过参数接收依赖对象(主要是在对象构造期间)是一种非常常见的模式,因为它通过接口而不是类来定义依赖关系。
使用接口可以帮助您建立合同,更好地将需求与实现分开(这是首先应用IoC的驱动因素)。此外,它可以帮助您编写测试和模拟。但那是另一种可能性。玩得开心!我已经使用Ninject差不多一年了,我发现它很容易使用和维护。
答案 1 :(得分:1)
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;
}
}
}
和IoC看起来像:
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"); }
}
的Ad1。我将在Main函数中添加IoC框架配置/初始化,并将对初始化容器的引用传递给其余代码。
答案 2 :(得分:0)
On Dependency Injection ...根据您所说的语言,这可能不是真的。在C#/ VB.NET案例中,是的。在JavaScript,Ruby等动态语言中并不是真的。我想现在,如果你使用的是DynamicObject,它也可能是错误的。通过指定您的类依赖于接口而不是具体类,您可以手动或通过使用像Ninject这样的IoC容器轻松地注入该接口的不同实现。
On Inversion of Control ...它基本上是说调用类/方法不是创建它需要做的工作所需的其他组件,而是让它在其他地方创建并将它传递给你的类/方法。打破这个具体的依赖关系链将使您的代码更加松散耦合,并允许您使用实现相同接口/契约的不同组件替换所需组件的一个实现。
关于依赖倒置原则/ IOC的优秀解释可以在http://www.objectmentor.com/resources/articles/dip.pdf中找到。
关于这个主题的其他好资源: