- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我需要更多帮助才能“了解”像 Ninject 这样的 DI 框架如何超越基础知识。
以 Ninject 为例:
class Samurai {
private IWeapon _weapon;
[Inject]
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
public void Attack(string target) {
_weapon.Hit(target);
}
}
如果没有 DI 框架(即上面的 [Inject] 引用),引用类将类似于:
class Program {
public static void Main() {
Samurai warrior1 = new Samurai(new Shuriken());
Samurai warrior2 = new Samurai(new Sword());
warrior1.Attack("the evildoers");
warrior2.Attack("the evildoers");
}
}
...您更新所有内容的地方。是的,您已经删除了 Samurai 中的依赖项,但现在您在链条上更进一步获得了依赖项。简单。
使用 Ninject,您可以通过以下方式摆脱更新所有内容:
class Program {
public static void Main() {
IKernel kernel = new StandardKernel(new WarriorModule());
Samurai warrior = kernel.Get<Samurai>();
warrior.Attack("the evildoers");
}
}
然而,这是我感到困惑的地方:如果没有制作某种服务定位器来有效地更新适用的内核和模块(即 .IoC.TypeResolver.Get<>()),什么是 a)不必在任何地方都更新内核的最佳方法(到处都引用服务定位器?),以及 b) 更重要的是,当你有一个很大的长链并且有自己的依赖关系时,你会把它带到传递注入(inject)的极端一路向上,我确信这是一个严重的反模式(一个 friend 称之为“烫手山芋依赖注入(inject)”反模式)。
换句话说,我认为 DI 框架的神奇之处在于,您不必一直在链上插入依赖项(即,您的第一个引用在其构造函数中包含 10 个参数,其中没有任何参数做任何事,直到沿着链更远)- 魔法 或解决我的困惑的方法在哪里,这样依赖项就不会不断地在链上向上引用,或者服务定位器引用遍布各处.
如果使用 DI 框架,让我更加困惑的是,如果使用 DI 框架,那么处理引用类需要 IList 的情况的最佳方法是什么,该 IList 通常会放在构造函数中(即 new ReferencedClass(myList)) ,除了在像字符串数据库连接字符串这样的简单情况下,不会飞。 new up/DI Framework service locating 后做一个属性设置就可以了? IE。
var referencedClass = IoC.Get<IReferencedClass>();
referencedClass.MyList = myList;
总而言之,我认为这是一个我收到后可能会感到尴尬的帖子,但现在,我已经多次撞墙试图确定最佳方法。
最佳答案
至于“烫手山芋”的依赖问题,这倒不一定发生。依赖注入(inject)框架会为你处理这个。
例如,如果 Class1 依赖于 Class2,而 Class2 依赖于 Class3,则您不需要将 Class3 注入(inject) Class1 以适应 Class2 依赖。当您请求 Class1 时,内核将为您走下依赖链并自动解决下游依赖(只要所有正在运行的类都已在内核中注册)。
Class1 depends on Class2 depends on Class3
Class1 的构造函数根本不需要提及 Class3。
至于第二个问题,如何或是否容纳取决于框架。使用 Ninject,我认为您可以使用 Bind().To().WithConstructorArgument()
语法向构造函数提供新的列表项。
关于c# - DI Framework : how to avoid continually passing injected dependencies up the chain, 且未使用服务定位器(特别是使用 Ninject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993273/
如果我有一个包含 debian/control 和 Build-Depends 条目的 Depends 文件。 如何安装两组依赖项? 目前我正在使用以下命令创建一个依赖于 Build-Depends
我一直在查看衬底节点模板的Cargo.toml文件,并注意到,对于大多数 crate 而言,其依赖性如下所示: [dependencies.grandpa] package = 'sc-finalit
我在 Netbeans 7.1 IDE 中有一个 Maven 项目。 我想为 Dependencies 添加相同的依赖项和 Test Dependencies . 添加到一个中会将其从另一个中删除。
我正在尝试解决此处描述的问题: http://www.jayway.com/2013/04/12/solving-asm-conflicts-after-upgrading-to-groovy-2-1
我研究过这个问题,但找不到共识。如果“A 依赖于 B”,术语“依赖性”指的是: 一个 B A和B的关系 这个术语在计算机技术的不同子领域中是否有不同的含义? 最佳答案 B 将是依赖项。您可能会以“B
WebLogic 10.3.6Java 1.6 所以我在使用 Eclipse 时遇到了 XML 问题。 7天前我去度假之前,这一切运行良好。事实上,在我离开之前,我恢复到了旧版本,因为我在一些不太重要
在问这个问题之前,我想说 this stackoverflow 中的问题与我的问题非常相似,但概念仍然不清楚,非常困惑。 我想了解依赖倒置原则,但我无法完全理解它? 下面是DIP说的两点 A. Hig
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
我正在尝试使用 apache maven 创建一个包。当我运行 mvn clean install 命令时,出现以下错误: dependencies.dependency.version' is mi
在 Real World Ocaml Chapter 9这是关于仿函数的: Dependency injection Makes the implementations of some compone
我已经构建了类似用于创建网站的基本模板/工作流的东西,主要使用 Grunt。 该模板的一部分是 Modernizr 特征检测库,我的一项 Grunt 任务依赖于它。 目前我只是将该依赖项存储在我的 b
我有固定依赖项的 python 项目。由于第三方依赖项中的错误,在我的包中发现了错误。该依赖项已发布修复该错误的补丁。然而,根据 semantic versioning ,是否为固定依赖项的每个补丁版
使用插件io.spring.dependency-management ,我的依赖的一些版本是从其他依赖中扣除的 id("io.spring.dependency-management") versi
我有这两个表“员工表,从属表” 员工表有“ID, employee_id, employee_name” 从属表有“ID, employee_id, dependent_name, relations
我正在使用 Eclipse 中的一个 mavenised java 项目,其中有几个模块无法构建并从 pom 文件中抛出错误: Project build error: 'dependencies.d
我有一个包含多个模块的 maven 项目。在 Eclipse(Juno,带有 m2e)中,它似乎编译得很好。但是当我在其中一个模块上进行 maven 安装时,构建会立即失败。 父 pom: com
我使用 eclipse juno 创建了一个 maven 项目并编辑了 pom 文件。当我通过“mvn clean install”使用命令提示符运行 pom 文件时,出现此错误。 [ERROR] T
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
似乎包括与 provided 的直接依赖关系范围很好理解。似乎还包括带有 runtime 的传递依赖项。范围也很容易实现。 但是我如何才能包含两个间接级别的依赖项? 例子: A --> B --> C
我有以下情况: 我想在我的另一个项目中使用我的一个项目(托管在 bintray.com 上)。 我设置了一个 Maven 存储库,上传了 Artifact 和 pom 文件,然后能够使用上传到 bin
我是一名优秀的程序员,十分优秀!