通过名称解析依赖注入

问题描述

命名绑定没有内置解决方案。但是,使用工厂方法可能对您的情况有所帮助。示例应如下所示:

创建存储库解析器:

public interface IRepositoryResolver
{
    IRepository GetRepositoryByName(string name);
}

public class RepositoryResolver : IRepositoryResolver 
{
    private readonly IServiceProvider _serviceProvider;
    public RepositoryResolver(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }
    public IRepository GetRepositoryByName(string name)
    {
         if(name == "TestSuiteRepository") 
           return _serviceProvider.GetService<TestSuiteRepositor>();
         //... other condition
         else
           return _serviceProvider.GetService<BaseRepositor>();
    }

}

注册所需的服务ConfigureServices.cs

services.AddSingleton<IRepositoryResolver, RepositoryResolver>();
services.AddTransient<TestSuiteRepository>();
services.AddTransient<BaseRepository>(); 

最后在任何类中使用它:

public class BaselineManager
{
    private readonly IRepository _repository;

    public BaselineManager(IRepositoryResolver repositoryResolver)
    {
        _repository = repositoryResolver.GetRepositoryByName("TestSuiteRepository");
    }
}

解决方法

如何为特定类注入不同的对象实现?

例如,在 Unity 中,我可以定义两个实现IRepository

container.RegisterType<IRepository,TestSuiteRepositor("TestSuiteRepository");
container.RegisterType<IRepository,BaseRepository>(); 

并调用所需的实现

public BaselineManager([Dependency("TestSuiteRepository")]IRepository repository)