我正在阅读一本书,该书显示依赖性注射在使用工厂功能时如何工作,以下是代码:
//MemoryRepository implements IRepository
public class Startup
{
private IHostingEnvironment env;
public Startup(IHostingEnvironment hostEnv) => env = hostEnv;
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository>(provider =>
{
if (env.IsDevelopment())
{
var x = provider.GetService<MemoryRepository>();
return x;
}
else
{
return new XXX(); //return sth else;
}
});
services.AddTransient<MemoryRepository>();
...//register other components which are dependencies of MemoryRepository
services.AddMvc();
}
...
}
我不知道为什么需要services.AddTransient<MemoryRepository>();
?
因为services.AddTransient<IRepository>{...}
已经定义了"瞬态"范围,这意味着"每次需要iRepository时,都会提供一个新的Memory Repository对象(如果是开发环境(",因此所有内容都是设置的,而其他依赖性则是Memory Repository的其他依赖关系将通过以下注册来处理。
Q1-因此,为什么我们仍然需要再次拥有services.AddTransient<MemoryRepository>();
?如果我发表评论,应用程序将无法运行,因此需要此语句,我只是不知道为什么
Q2-如果我将Configureservices修改为:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository, MemoryRepository>();
...
}
应用程序成功运行,所以为什么在这种情况下,我不需要添加 services.AddTransient<MemoryRepository>();
as:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IRepository, MemoryRepository>();
services.AddTransient<MemoryRepository>();
...
}
第一个
services.AddTransient<IRepository>(...
告诉提供商当要求解决IRepository
第二个
services.AddTransient<MemoryRepository>();
告诉提供商当要求解决MemoryRepository
从技术上讲,您不是"双"注册。
所以为什么我们仍然需要
services.AddTransient<MemoryRepository>()
所以当
provider.GetService<MemoryRepository>();
在工厂委托中援引提供商知道如何解决以满足开发环境条件的方式。
代码样本基本上显示了如何执行条件依赖性,我认为您已经理解了。
Q2
在第二种情况下,不需要第二个注册
services.AddTransient<MemoryRepository>();
,因为在这种情况下,只需明确需要将MemoryRepository
用作注入依赖项