依赖注入按名称解析 [英] Dependency injection resolving by name
本文介绍了依赖注入按名称解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
例如,我可以:
定义 IRepository
container.RegisterType< IRepository,TestSuiteRepositor(TestSuiteRepository);
container.RegisterType< IRepository,BaseRepository>();
并调用需要的实现
public BaselineManager([Dependency(TestSuiteRepository)] IRepository仓库
解决方案
正如@Tseng所指出的,没有内置的解决方案来命名绑定。但是使用工厂方法可能对您的情况有帮助。示例应该如下所示:
创建存储库解析器:
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)
返回_serviceProvider.GetService< TestSuiteRepositor>();
// ...其他条件
else
返回_serviceProvider.GetService< BaseRepositor>();
}
}
在<$ c中注册所需的服务$ c> 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);
}
}
How I can inject different implementation of object for specific class?
For example in unity I can:
Define two implementation of IRepository
container.RegisterType<IRepository, TestSuiteRepositor("TestSuiteRepository");
container.RegisterType<IRepository, BaseRepository>();
and call needed implementation
public BaselineManager([Dependency("TestSuiteRepository")]IRepository repository)
解决方案
As @Tseng pointed, there is no built-in solution for named binding. However using factory method may be helpful for your case. Example should be something like below:
Create a repository resolver:
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>();
}
}
Register needed services in ConfigureServices.cs
services.AddSingleton<IRepositoryResolver, RepositoryResolver>();
services.AddTransient<TestSuiteRepository>();
services.AddTransient<BaseRepository>();
Finally use it in any class:
public class BaselineManager
{
private readonly IRepository _repository;
public BaselineManager(IRepositoryResolver repositoryResolver)
{
_repository = repositoryResolver.GetRepositoryByName("TestSuiteRepository");
}
}
这篇关于依赖注入按名称解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文