如何在构造函数中注入 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&lt;ICustomRepository&gt;,其中填充了具有此 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>,以便我可以决定在基类中使用哪一个?的主要内容,如果未能解决你的问题,请参考以下文章

IEnumerable 流式传输

如何在 ASP.NET Core 中获取没有构造函数注入的注入服务的实例?

当我的服务在其构造函数中有可注入对象时,如何将服务注入我的测试?

如何将null值传递给简单注入器中的构造函数?

如何在其构造函数中获取使用依赖注入的类的实例

Spring依赖注入构造器注入(通过构造函数注入)