Dependency injection 在asp.net core中使用依赖项注入而不是手动创建实例的原因

Dependency injection 在asp.net core中使用依赖项注入而不是手动创建实例的原因,dependency-injection,asp.net-core,createinstance,Dependency Injection,Asp.net Core,Createinstance,各位,我正在学习Asp.net核心。我面临一个选择,即如何创建服务类型的实例。在使用WCF时,我曾经编写过一些代码: public class SomeService:ISomeService { [WebInvoke(UriTemplate="action1")] public void DoSomething1() => new DBAccessBroker1().DoSomethingWithDB(); [WebInvoke(UriTemplate="act

各位,我正在学习Asp.net核心。我面临一个选择,即如何创建服务类型的实例。在使用WCF时,我曾经编写过一些代码:

public class SomeService:ISomeService
{
    [WebInvoke(UriTemplate="action1")]
    public void DoSomething1() => new DBAccessBroker1().DoSomethingWithDB();

    [WebInvoke(UriTemplate="action2")]        
    public void DoSomething2() => new DBAccessBroker2().DoSomethingWithDB();
}
在上面的代码中,我在创建服务实例SomeService时创建了DBAccessBroker的实例。现在,在Asp.net核心中,可以使用依赖项注入实现相同的功能,如下所示:

public class Startup
{
    ...
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<DBAccessBroker1>();
        services.AddSingleton<DBAccessBroker2>();
        ...
    }
    ...
}
public class SomeController : Controller
{
     DBAccessBroker1 broker1=null;
     DBAccessBroker2 broker2=null;
     public SimeController(DBAccessBroker1 broker1,DBAccessBroker2 broker2)
     {
         this.broker1=broker1;
         this.broker2=broker2;
     }

     [HttpPost("action1")]
     public void DoSomething1()=>broker1.DoSomethingWithDB();

     [HttpPost("action2")]
     public void DoSomething2()=>broker2.DoSomethingWithDB();
}
公共类启动
{
...
public void配置服务(IServiceCollection服务)
{
services.AddSingleton();
services.AddSingleton();
...
}
...
}
公共类控制器:控制器
{
DBAccessBroker1 broker1=null;
DBAccessBroker2 broker2=null;
公共SimeController(DBAccessBroker1 broker1、DBAccessBroker2 broker2)
{
this.broker1=broker1;
this.broker2=broker2;
}
[HttpPost(“行动1”)]
public void DoSomething1()=>broker1.DoSomethingWithDB();
[HttpPost(“行动2”)]
public void DoSomething2()=>broker2.DoSomethingWithDB();
}
显然,手动创建实例比使用DI更简洁,因为不需要注册DI服务,也不需要编写带有参数的奇数控制器构造函数,就像来自空中一样


另一方面,我相信让微软将DI合并到Asp.NETCore中肯定会有好处。我想DI应该使用缓存或某种可重用机制等特性来实现。但是我没有找到一些文件来证实。因此,我想知道是否有一些内部人士或有更深入了解的人可以告诉我DI的基本原理。我需要确信使用DI创建我的服务类型实例,而不是在我的案例中手动创建。

在您的案例中,使用DI至少有两个优点:

1) 您不应该关心应该传递给代理构造函数的参数。当它的创建逻辑位于其他位置(Startup.cs或custom factory)时,您将收到现成的实例

2) 在处理同一用户请求期间,DI可以将同一个代理实例提供给控制器和一些其他服务,并将其他实例提供给处理其他请求的几个类(甚至是同时提供的)——如果您使用作用域生存期注册它们的话


如果您不需要这些“功能”-您可以“手动”创建代理。

使用DI至少有两个优点:

1) 您不应该关心应该传递给代理构造函数的参数。当它的创建逻辑位于其他位置(Startup.cs或custom factory)时,您将收到现成的实例

2) 在处理同一用户请求期间,DI可以将同一个代理实例提供给控制器和一些其他服务,并将其他实例提供给处理其他请求的几个类(甚至是同时提供的)——如果您使用作用域生存期注册它们的话

如果您不需要这些“功能”-您可以“手动”创建代理。

可能重复的