2011-02-18 67 views
2

我在研究类之间的高耦合,特别是IoC。 我想问一些问题:关于IoC的问题

  1. 我正在使用Ninject;哪一层我应该把dll Ninject
  2. 当我创建一个设置发送到客户端时,dll Ninject也会去找客户吗?
  3. 我一直在研究互联网,得出如下结论: a。控制反转是当我改变我的类,并且我没有在他们自己的类中实例化它们,而是作为参数或使用Ninject b。依赖注入是当我添加到我的项目接口而不是具体的类。

回答

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; 
     } 
    } 
} 

,并与国际奥委会它可能看起来像:

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框架配置/初始化,并将引用初始化容器传递给其余代码。

+0

谢谢! 我会继续学习。 – ridermansb 2011-02-18 18:27:46

2
  1. IoC的概念与建筑图层的概念是正交的。每当您使用Ninject功能(例如[Inject]属性(通常在注入类的级别)或(b)无论您设置内核和模块(通常在客户端级别))时,您都必须参考Ninject(a)。

  2. 是的。 Ninject将成为运行时的依赖。

  3. 国际奥委会可能会出现这些行为,但其核心概念可能会被更好地理解为Holywood principle:不要打电话给我们,我们会打电话给你。这意味着,不要打扰建立你的依赖关系,因为它们将为你提供。尽管Ninject等工具可以极大地缓解您的生活,但您可以通过多种方式达到此目的,即使是“手动”。无论如何,通过参数接收依赖对象(主要是在对象构造期间)是一种非常常见的模式,因为它通过接口而不是类来定义依赖关系。

使用接口可以帮助你从实现建立合同,以更好地分开的要求(这是摆在首位应用的IoC驱动的原因)。另外,它可以帮助你编写测试和模拟。但那是另一个可能性的世界。玩的开心!我已经使用Ninject将近一年了,而且我发现它非常易于使用和维护。

0
  1. 你应该有Ninject参考anyhwere您使用它来注册&解决您的依赖。最明显的地方在于你的应用程序外壳/入口点。
  2. 关于依赖注入......根据您所说的语言,这可能不是真的。在C#/ VB.NET的情况下,是的。在JavaScript,Ruby等动态语言中并非如此。我想现在,如果你使用的是DynamicObject,它也可能是错误的。通过指定你的类依赖于一个接口而不是一个具体的类,你可以手动地或通过使用像Ninject这样的IoC容器轻松地注入该接口的不同实现。

    On Inversion of Control ...它基本上是说不是调用类/方法创建其他组件需要执行其工作,而是让它在别处创建并传递给您的类/方法。打破这个具体的依赖关系链将使你的代码更加松散耦合,并允许你用一个实现了相同接口/契约的不同组件来替换所需组件的一个实现。

    上依赖倒置原则/ IOC一个很好的解释,可http://www.objectmentor.com/resources/articles/dip.pdf找到。

    这个主题

    其他好的资源: