答案 0 :(得分:3)
答案 1 :(得分:2)
正如Grodon在评论中所说:函数/方法参数是依赖注入 - 几乎所有语言都支持最低级别的语言。
DI框架通常针对服务器环境而定制。语言机制只是错误的抽象层次。
答案 2 :(得分:2)
实际上,它们通过让参数传递给方法/构造函数/函数来实现 - 而这几乎就是它的全部内容,DI框架所做的只是指定参数值的一种奇特方式。
一个更有趣的问题是如何在语言级别强制执行依赖注入。禁止static
州可能是一个好的开始(就像Newspeak那样)。
答案 3 :(得分:2)
我个人可以看到这个好处。例如,我一直在编写这样的代码:
public class MyService : IService
{
// Boilerplate!
private readonly IDependency1 dep1;
private readonly IDependency2 dep2;
private readonly IDependency3 dep3;
public MyService(IDependency1 dep1, IDependency2 dep2,
IDependency3 dep3)
{
// More boilerplate!
this.dep1 = dep1;
this.dep2 = dep2;
this.dep3 = dep3;
}
// Finally something useful
void IService.DoOperation()
{
using (var context = this.dep1.CreateContext())
{
this.dep2.Execute(context);
context.Commit();
}
this.dep3.Log("Success");
}
}
能够按如下方式编写它不是很好吗:
public class MyService : IService
{
public MyService(private IDependency1 dep1,
private IDependency2 dep2, private IDependency3 dep3)
{
}
void IService.DoOperation()
{
using (var context = this.dep1.CreateContext())
{
this.dep2.Execute(context);
context.Commit();
}
this.dep3.Log("Success");
}
}
我希望我可以通过声明我的依赖项字段并在构造函数中分配它们来省略所有管道。
<强>更新强>
我们的祈祷可能已被听到。 C#team might be adding“类定义的简洁语法”,例如可以在C#6.0中直接从构造函数声明的us属性。让我们希望这样的特征能够发挥作用。
所以你的核心问题“为什么语言不将依赖注入集成在核心?”,他们这样做了。 Scala和F#已经让这更容易了,C#有望继续。
与此同时,我试图通过在部分课程中为你写T4 template that generates the constructor来克服这个障碍,但是在应用程序中使用它几周之后它确实无法按预期工作
答案 4 :(得分:1)
这本质上是一种有缺陷的方法。理想情况下,语言应该尽可能精简,但要足够强大,可以引入任意语言级抽象(想想LISP和元编程)。如果没有,你在哪里划清界限和遗漏之间的界线?
至于引入DI的编译级支持,这是不可能的。您的应用程序可能使用动态链接的各种库,这些库在编译时可能甚至都不知道。想想插件。
答案 5 :(得分:1)
如果语言足够灵活,它可以模拟 DI。 Java和C#显然不是,但通常是功能或混合语言。例如。在Haskell中,您可以使用Reader Monad来保存“环境”而不会乱丢代码,或者您可以使用类型类。 Scala具有mixin组合和隐式对象,这两者都可以用于此。所以我会得出结论,一个真正需要 DI的语言缺乏适当而强大的抽象机制。