can*_*stu 3 c# asp.net dependency-injection parameter-passing asp.net-core
我已将依赖注入添加到项目中。但是当我使用new关键字创建实例时,依赖注入不起作用。
public class MyClass
{
ILoginTokenKeyApi _loginTokenKeyApi;
public MyClass(ILoginTokenKeyApi loginTokenKeyApi)
{
_loginTokenKeyApi = loginTokenKeyApi;
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试创建 MyClass 的实例时,它希望自然构造一个参数。
像这样 :
MyClass mc = new MyClass(); // ERROR, it wants a parameter (but it is what i want)
Run Code Online (Sandbox Code Playgroud)
我要做 :
MyClass mc = new MyClass(new LoginTokenKeyClass()); // this is not a good code for me
Run Code Online (Sandbox Code Playgroud)
我如何创建没有参数的 MyClass 实例,因为它注入了依赖项。
但是当我使用
new关键字创建一个实例时,依赖注入不起作用。
这就是依赖注入的基本工作原理。
使用依赖注入,您根本不应该创建new新对象。这就是依赖注入和控制反转的全部意义所在。相反,创建对象并管理这些对象的依赖,你是取决于框架,给你的依赖关系,你需要,而无需你关心他们究竟来自哪里,以及如何他们的构筑。因此,您正在将创建对象的责任转移给调用者。
如果您发现自己需要创建一个具有依赖项的对象,那么这清楚地表明您做错了。一个常见的原因是你想要创建对象来管理它的生命周期,或者因为它实际上是一个数据对象,恰好有一些需要其他依赖项才能工作的操作(例如一个具有“保存“ 方法)。在第一种情况下,您根本不会那样做。你只需要依赖它,让框架管理生命周期;如果它的生命周期不正确,那么您应该使用 DI 容器重新配置它。
在后一种情况下,您有一个带有操作的数据对象,您应该将其拆分。您应该只有一个数据对象,没有任何逻辑,然后注入一些能够为您对该数据对象执行操作的管理器服务。
例如,在 ASP.NET Core Identity 中,您拥有的User对象只是一个没有任何逻辑的普通实体。例如,为了添加用户角色或更改密码,您依赖于您可以注入的用户管理器。所以User对象本身没有任何依赖。
我通常建议您阅读ASP.NET Core 文档的依赖注入章节,以了解依赖注入是如何工作的以及它应该如何在框架中使用。
小智 0
有两种类型的依赖注入。
执行 DepInjection 的另一种方法是在无参数构造函数中 - 您可以通过键/名称获取对象。就像在 Spring.Net 中一样,我们会这样做:
var UtilityObject = Spring.ContextRegistry.GetContext().GetObject("MyUtilObject") as TheUtilityClass;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8771 次 |
| 最近记录: |