c# - DI 无法从子接口(interface)解析基本接口(interface)

标签 c# dependency-injection

我有一个相当简单的存储库设计设置。使用 DI 解析 Controller 构造函数中的存储库。

但是 DI 的行为相当奇怪。它似乎无法解析被解析为注册接口(interface)基础的依赖关系。我相信它应该能够做到这一点,因为满足子接口(interface)的任何类型也必须满足基本接口(interface)。

有兴趣知道是否有人知道为什么会发生这种情况?

示例:

基本接口(interface)

public interface IReadOnlyRepository<T>
{
    void DoSomething();
}

子接口(interface)

public interface IReadWriteRepository<T> : IReadOnlyRepository<T>
{
    void DoSomethingElse();
}

实现

public class AccountRepository: IReadWriteRepository<Account>
{
    public void DoSomething() { /* BLAH */ }
    public void DoSomethingElse() { /* BLAH */ }
}

注册

services.AddTransient<IReadWriteRepository<Account>, AccountRepository>();

分辨率

provider.Resolve<IReadWriteRepository<Account>>(); // SUCCEEDS :)
provider.Resolve<IReadOnlyRepository<Account>>(); // FAILS! :(

最佳答案

这不是依赖注入(inject)的工作原理。如果你想要IReadOnlyRepository<Account>解决 AccountRepository您也必须注册它。

services.AddTransient<IReadOnlyRepository<Account>, AccountRepository>();

否则,DI 容器如何知道要生成什么。想象一下您的想法实际上会起作用,如果您要求它解决 IDisposable 会发生什么或IEnumerable ?它不可能神奇地知道你需要什么,你必须明确。

关于c# - DI 无法从子接口(interface)解析基本接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393738/

相关文章:

c# - foreach KeyValuePair in NameValueCollection?

java - 如何在 guice 中使用依赖注入(inject)字段进行静态最终字段初始化?

scala - 如何在 scala 中进行依赖注入(inject)?

php - Symfony2 : Better way to inject services between another services

c# - 如何强制开发人员将属性应用于类?

c# - 类型转换和类型问题

c# - Windows开发如何快速学习Autofac?

swift - 使用依赖注入(inject)和可达性(互联网检查)类?

c# - 预编译一个非常大的正则表达式

c# - 如何从键盘读取字符直到收到一个句点,并计算空格数