如何在构造函数中注入 IEnumerable<ICustomRepository>,以便我可以决定在基类中使用哪一个?
Posted
技术标签:
【中文标题】如何在构造函数中注入 IEnumerable<ICustomRepository>,以便我可以决定在基类中使用哪一个?【英文标题】:How to inject a IEnumerable<ICustomRepository> in constructor, so I can decide which one to use in the base class? 【发布时间】:2021-12-30 01:50:26 【问题描述】:我不知道这是哪种模式,但我想完成添加多个使用 DI 的类的 IEnumerable。在我的示例中,我想在 BaseRepository 中注入 IEnumerable<ICustomRepository>
,其中填充了具有此 ICustomRepository 接口并使用注入的 Custom2Repository 和 Custom2Repository 类。
任何人都可以帮助我朝着正确的方向前进吗?
这是主类
public class BaseRepository : IBaseRepository
private readonly IProvider _provider;
private readonly DbContext _dbContext;
private readonly IEnumerable<ICustomRepository> _customRepositories;
private string _databaseName;
public BaseRepository(IProvider provider, DbContext dbContext, **IEnumerable<ICustomRepository> customRepositories**)
_provider = provider;
_dbContext = dbContext;
_customRepositories = customRepositories;
public async Task ChangeAsync(string id, CancellationToken cancellationToken)
var tracker = _provider.Get();
var change = tracker.GetChange(id);
foreach (var repo in **_customRepositories**)
if (repo.EntityName == change.EntityName)
_databaseName = repo.DatabaseName;
repo.Method1(id, cancellationToken)
await tracker.SaveChangesAsync(_databaseName, cancellationToken);
...
这个我想在baseRepository中注入基础IEnumerable
public class Custom1Repository : ICustomRepository
public Custom1Repository(IProvider provider, DbContext dbContext)
_provider = provider;
_tracker = tracker.Get();
_dbContext = dbContext;
public string EntityName => "EntityOne";
public string DatabaseName get; private set;
public async Task Method1Async(string id, CancellationToken cancellationToken)
...
这个我也想在baseRepository中注入基础IEnumerable
public class Custom2Repository : ICustomRepository
public Custom2Repository(IProvider provider, DbContext dbContext)
_provider = provider;
_tracker = tracker.Get();
_dbContext = dbContext;
public string EntityName => "EntityTwo";
public string DatabaseName get; private set;
public async Task Method1Async(string id, CancellationToken cancellationToken)
...
感谢您的意见。我通过删除 Custom1Repository 和 Custom2Repository 类中的 ITracker 解决了这个问题。我已经在 serviceCollection 中注册了这 2 个类,如下所述。
【问题讨论】:
如果 BaseRepository 和 CustomRepository 之间没有继承,这应该可以工作。我不明白你为什么想要这个,但它应该工作。不是吗?为什么不呢? ***.com/a/67940868/3811265 【参考方案1】:你可以这样做:
serviceCollection
.AddSingleton<ICustomRepository , Custom1Repository>();
serviceCollection
.AddSingleton<ICustomRepository , Custom2Repository>();
然后像这样使用它:
public BaseRepository(IProvider provider, DbContext dbContext, IEnumerable<ICustomRepository> customRepositories)
_provider = provider;
_dbContext = dbContext;
_customRepositories = customRepositories;
【讨论】:
【参考方案2】:你不能这样做。 尝试注入一个 CustomRepositoryFactory 代替。通过这个类,您可以创建 ICustomRepository。
【讨论】:
以上是关于如何在构造函数中注入 IEnumerable<ICustomRepository>,以便我可以决定在基类中使用哪一个?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET Core 中获取没有构造函数注入的注入服务的实例?