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 Core中,使用依赖注入可以实现相同的功能:
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();
}
显然,手动创建实例比使用DI更简洁,因为不需要注册DI服务并编写带有参数的奇数控制器构造函数,就像来自空中一样。
另一方面,我认为让微软将DI纳入Asp.Net Core必然会有好处。我想DI应该使用缓存或可重用机制等功能来实现。但我没有找到一些文件来证实。所以我想知道一些内部人员或有更深入了解的人是否可以告诉我DI的基本原则。我需要确信在我的情况下使用DI而不是手动创建我的服务类型的实例。
答案 0 :(得分:2)
在你的情况下使用DI至少有两个专业人士:
1)您不应该关心应该传递给经纪人的参数。您将收到现成的实例,而它的创建逻辑位于其他位置(Startup.cs或自定义工厂)。
2)DI可以在处理相同的用户请求时向控制器和其他一些服务提供相同的代理实例,并将其他实例提供给处理其他请求的几个类(甚至同时) - 如果您使用Scope生存期注册它们。
如果您不需要任何“功能” - 您可以“手动”创建经纪人。