为什么使用工厂功能时请仔细注册服务



我正在阅读一本书,该书显示依赖性注射在使用工厂功能时如何工作,以下是代码:

//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用作注入依赖项

最新更新