相关疑难解决方法(0)

什么是控制倒置?

控制反转(或IoC)在第一次遇到时会非常混乱.

  1. 它是什么?
  2. 它解决了哪个问题?
  3. 何时适合使用,何时不适用?

oop design-patterns inversion-of-control

1704
推荐指数
30
解决办法
46万
查看次数

创建单例来访问统一容器或通过应用程序传递它是否更好?

我正在使用IoC框架,我选择使用Unity.我还没有完全理解的一件事是如何更深入地解析应用程序中的对象.我怀疑我当时还没有灯泡可以说清楚.

因此,我尝试在psuedo'ish代码中执行以下操作

void Workflow(IUnityContatiner contatiner, XPathNavigator someXml)
{
   testSuiteParser = container.Resolve<ITestSuiteParser>
   TestSuite testSuite = testSuiteParser.Parse(SomeXml) 
   // Do some mind blowing stuff here
}
Run Code Online (Sandbox Code Playgroud)

所以testSuiteParser.Parse执行以下操作

TestSuite Parse(XPathNavigator someXml)
{
    TestStuite testSuite = ??? // I want to get this from my Unity Container
    List<XPathNavigator> aListOfNodes = DoSomeThingToGetNodes(someXml)

    foreach (XPathNavigator blah in aListOfNodes)
    {
        //EDIT I want to get this from my Unity Container
        TestCase testCase = new TestCase() 
        testSuite.TestCase.Add(testCase);
    } 
}
Run Code Online (Sandbox Code Playgroud)

我可以看到三个选项:

  1. 创建一个Singleton来存储我可以在任何地方访问的Unity容器.我真的不喜欢这种方法.添加这样的依赖项来使用依赖注入框架似乎有点奇怪.
  2. 将IUnityContainer传递给我的TestSuiteParser类及其中的每个子类(假设它是n级深度或实际上大约3级深度).在任何地方传递IUnityContainer只是看起来很奇怪.我可能只需要克服这一点.
  3. 在正确的方式上使用Unity的灯泡时刻.希望有人可以帮助轻弹开关.

[编辑]我不清楚的一件事是我想为foreach语句的每次迭代创建一个新的测试用例实例.上面的示例需要解析测试套件配置并填充测试用例对象的集合

c# ioc-container unity-container

49
推荐指数
2
解决办法
2万
查看次数

控制反转<依赖注入

我感觉不存在控制倒置这样的事情,或者说正确的术语是依赖注入.我错了这个假设吗?

我一直试图为自己定义IoC.在这样做的过程中,我学到了很多关于IoC容器和依赖注入的知识.

刚才,我从Martin Fowler的网站上看到了这个:

结果我认为我们需要一个更具体的名称来模式.控制反转过于笼统,因此人们会发现它令人困惑.结果与各种IoC倡导者进行了大量讨论,我们选择了Dependency Injection这个名称.

在现代IoC世界中,依赖注入只是实现IoC的一种方式吗?

dependency-injection terminology inversion-of-control

20
推荐指数
2
解决办法
7744
查看次数

DIP vs. DI与IoC

大概2个月我一直在阅读这三个主题我能找到的所有东西,我还不确定我是否已经找到了.

  1. 依赖倒置原则.意味着你应该始终只依赖于接口而不是它们的实现.如果你的班级依赖于任何其他班级,这是不好的,因为它取决于第二类的细节.如果你的类依赖于接口,这绝对可以,因为这种依赖只意味着你的类需要一些抽象的东西,它可以做一些具体的事情而你并不真正关心它的做法.

    由于"DIP"中的P代表"原理",我应该用这种方式定义:依赖性倒置原则是一个原则,要求所有代码的实体仅依赖于他们真正需要的细节.

    通过"他们真正需要的细节",我指的是最简单的情况下的接口.我还使用"实体"这个词来强调DIP也适用于程序和其他任何东西,不仅适用于类.

  2. 依赖注入.它仅适用于启用DI的实体.启用DI的实体是一个"开放"的实体,用于配置其行为而不更改其内部.注入有两种基本类型(在谈论类时):

    • 构造函数注入 - 当您将所有必需的"抽象细节"传递给对象时,就在它即将构建的那一刻.
    • Setter Injection - 在您创建对象后"澄清"所需方面.

    因此,定义可能如下:依赖注入是将"抽象细节"传递给真正需要这些细节的实体的过程.

    通过"真正需要这些细节",我指的是最简单的情况下的接口."实体"一词一如既往地用来强调DI也适用于程序和其他任何东西.

  3. 控制反转.它通常被定义为"库和框架之间的差异","以程序编程中的任何一种方式编写程序"等等.这对我来说是最令人困惑的事情.我认为这里的主要想法只是启动任何行动.要么"随时随地"(程序方式)做某事,要么"等"直到有人问你(IoC方式).

    我的定义是:IoC是程序执行流程的一个属性,当你不要做任何事情,直到他们要求你这样做.

    这听起来就像"好莱坞原则",但我相信"好莱坞原则"和IoC都是完全相同的想法.

我理解吗?

architecture theory dependency-injection inversion-of-control

16
推荐指数
1
解决办法
6292
查看次数

IoC,AOP等

什么是IoC容器?

什么是IoC/DI框架?

为什么我们需要一个IoC/DI框架?

IoC/DI和AOP之间有什么关系吗?

什么是关于IoC和AOP的Spring.net/ninject?

dependency-injection spring.net ninject inversion-of-control

12
推荐指数
1
解决办法
3502
查看次数