标签: dependency-inversion

170
推荐指数
8
解决办法
7万
查看次数

依赖注入和依赖反转之间的区别

存在两种设计模式,即依赖注入和依赖性反转,文章在网上试图解释差异.但是,用更容易的话来解释它的必要性仍然存在.那里有人来接?

我需要在PHP中理解它.

php design-patterns dependency-injection dependency-inversion

23
推荐指数
3
解决办法
7150
查看次数

单元测试OSGi组件

我目前正在考虑"如何设计一个OSGi组件,以便使用jUnit和Mockito等框架轻松编写测试".

由于OSGi强化了DIP (依赖性倒置原则)并且通常存在注入器方法(例如设置器),因此模拟捆绑间依赖性非常容易.
但是捆绑内部依赖呢?

例如,看看这种情况.现在我想将它带入一个OSGi上下文...我们希望在OSGi平台中提供任何类型的网络协议作为声明性服务,并希望编写单元测试来测试直接与之交互的较低网络代码套接字对象.

如果我们将套接字创建重构为一个单独但仍然捆绑的内部POJO (Plain Old Java Object)类,我们应该如何将它注入协议实现?

  • 在单元测试中,我们可以简单地使用setter方法但是谁会在OSGi容器中为我们这样做?
  • 对测试类进行子类化并覆盖创建者方法只有在测试类未声明为final时才有效.

java osgi unit-testing dependency-inversion

13
推荐指数
1
解决办法
5704
查看次数

R6类的多重继承

实际问题

有什么方法可以解决R6不支持多重继承的问题

放弃

我知道R主要是一种功能语言.但是,它确实也有非常强大的面向对象的内置加:我看不出这有什么错模仿OOD原则/行为,当你

  1. 知道你是面向对象语言的原型,如C#,Java等.

  2. 您的应用程序原型需要自给自足("完整堆栈",包括DB后端,业务逻辑和前端/ UI)

  3. 你拥有像R6 这样伟大的 "原型技术"并且可以随意使用

上下文

我的用于Web应用程序的R原型需要"完全堆栈"/自给自足,并且尽可能接近我们的生产语言中使用的设计模式/原则和依赖注入容器(R中简单DI的概念证明)(C#/.净).

在这方面,我开始喜欢使用接口(或抽象类)来解耦代码模块并遵守OODSOLID原则D(依赖性反转原则)(详见 "Uncle Bob") ).

尽管R6没有明确支持接口,但我仍然可以完全模仿它们,除了"抽象方法"之外什么都没有定义R6类(参见下面的例子).这有助于我我的软件设计传达给我们不熟悉R的OO程序员.我努力为他们提供尽可能少的"概念转换努力".

但是,当我真正想从其他具体(而不是"类似抽象的"模仿接口类)继承时,我需要放弃我的inheritin R6Classfor 值,因为这将意味着定义不是一个但是两节课.inherit

在依赖倒置之前:

Foo取决于具体的课程Bar.从OOD原则来看,这非常糟糕,因为它导致代码紧密耦合.

Bar <- R6Class("Bar",
  public = list(doSomething = function(n) private$x[1:n]),
  private = list(x = letters)
) …
Run Code Online (Sandbox Code Playgroud)

oop r multiple-inheritance r6 dependency-inversion

11
推荐指数
2
解决办法
1539
查看次数

非泛型方法'IServiceProvider.GetService(Type)'不能与类型参数一起使用

我正在使用.NET Core依赖注入,但是当我试图在另一个类中获取服务时,我得到'IServiceProvider.GetService(Type)'不能与类型参数一起使用'错误.

这个错误意味着什么?我知道泛型类型的参数是这样的:GenericInterface <>,而GetService方法不会将GenericInterface <>作为参数.

为什么我会收到此错误,如何解决?

界面

public interface IService
{
   void Process();
}
Run Code Online (Sandbox Code Playgroud)

实现接口的类

public class Service : BaseService<IConfig, SomType>
{
    public Service(
        ILogger logger : base(logger)
    {
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

BaseService类是一个抽象类,它实现了IService接口.

public abstract class BaseService<TConfig, TE> : AnotherBaseService, IService where TConfig : IConfig where TE : struct, IConvertible
{
      protected BaseService(ILogger logger): base(logger)
      {
      } 

      ...
}
Run Code Online (Sandbox Code Playgroud)

AnotherBaseService

public abstract class BaseService
{
   protected readonly ILogger Logger;

   protected BaseService(ILogger logger)
   {
      Logger = logger;
   }

   ...
}
Run Code Online (Sandbox Code Playgroud)

我是如何注册的. …

c# console-application .net-core dependency-inversion

11
推荐指数
2
解决办法
4423
查看次数

依赖性反转和分离的接口模式(或一般的接口代码)之间有什么区别?

我无法弄清楚依赖性反转原理(SOLID原则之一)与通用"代码到接口"或分离接口模式之间的区别.他们都提倡创建一个抽象层来分离较低级别和较高级别的模块.

DI原则设想创建在更高层和更低层模块之间交互的接口,但也坚持接口必须是更高层包的一部分.
为什么这应该是更高层次而不是更低层次的一部分?它是暴露其行为的较低级别,所以解耦接口不应该是较低级别的一部分吗?如果有多个更高级别的模块取决于相同的较低级别怎么办?

或者,
为什么不制作一个单独的包来放置所有接口,然后可以被更高级别和更低级别使用?(这是分离接口模式设想的.)

我的困境是,我无法弄清楚它们的相对用途和好处.

请不要引用Derek Greer或Robert Martin的文章.我读过这些文章,但仍然存在混淆.

java interface dependency-inversion

9
推荐指数
1
解决办法
954
查看次数

什么是"高级模块"和"低级模块"(在依赖性倒置原则的背景下)?

我正在阅读维基百科对依赖性倒置原则的定义,它使用两个术语高级模块低级模块,我无法弄清楚.

他们是什么,依赖倒置原则与他们有什么关系

language-agnostic dependencies module inversion-of-control dependency-inversion

8
推荐指数
1
解决办法
2903
查看次数

PHP中的依赖倒置原则

由于PHP是一种松散类型的语言,如何在PHP中应用DIP原则?

一个实际的例子将不胜感激.

php oop solid-principles dependency-inversion

8
推荐指数
1
解决办法
2334
查看次数

依赖倒置原则对项目结构有哪些影响?

如果我想使用DIP开发一个假设的模块化C++项目.由于模块化,我选择在一个库中完全实现一个特定功能A.另一个库B(或两个或三个......)正在使用此功能(例如,日志记录机制):

class ILogger
{
    virtual void log(const std::string& s) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我应该把这个界面放在哪里?一些博主似乎建议,因为界面属于其用户(因为DIP),你应该将界面放在用户端(或这里).这也可以提高可测试性,因为您不需要任何实现链接到测试.

这意味着,库A本身不会编译,因为它缺少接口.这也意味着,如果库C也将使用日志记录工具,它还会引入一个接口ILogger,这将打破ODR?这可以通过引入仅包含接口的额外包层库来解决.但主要问题仍然存在:

在哪里放置界面?我阅读了关于DIP 的原始论文,但我不同意解释,我不应该将接口放入库中.我觉得这篇论文是作为如何思考开发的指导原则(因为"用户正在定义界面而不是实现者").它是否正确?你如何使用依赖倒置原则?

c++ deployment dependencies modularity dependency-inversion

8
推荐指数
1
解决办法
413
查看次数

JavaScript中的依赖倒置原则

是否有人能够帮助说明JavaScript jQuery中的依赖倒置原则

这将突出并解释这两点:

A.高级模块不应该依赖于低级模块.两者都应该取决于抽象.

B.抽象不应该依赖于细节.细节应取决于抽象.

什么是抽象或高/低级模块?

这真的有助于我理解,谢谢!

javascript jquery dependency-injection inversion-of-control dependency-inversion

7
推荐指数
2
解决办法
3298
查看次数