C# DI未从子接口解析基本接口

C# DI未从子接口解析基本接口,c#,dependency-injection,C#,Dependency Injection,我有一个相当简单的存储库设计设置。使用DI解析控制器构造函数中的存储库 然而,迪的行为相当奇怪。它似乎无法解析作为已注册接口基础解析的依赖项。我相信它应该能够做到这一点,因为满足子接口的任何类型也必须满足基接口 想知道是否有人知道为什么会发生这种情况 例如: 基本接口 public interface IReadOnlyRepository<T> { void DoSomething(); } public interface IReadWriteRepository<

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

然而,迪的行为相当奇怪。它似乎无法解析作为已注册接口基础解析的依赖项。我相信它应该能够做到这一点,因为满足子接口的任何类型也必须满足基接口

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

例如:

基本接口

public interface IReadOnlyRepository<T>
{
    void DoSomething();
}
public interface IReadWriteRepository<T> : IReadOnlyRepository<T>
{
    void DoSomethingElse();
}
公共接口IReadOnlyRepository
{
无效剂量();
}
子接口

public interface IReadOnlyRepository<T>
{
    void DoSomething();
}
public interface IReadWriteRepository<T> : IReadOnlyRepository<T>
{
    void DoSomethingElse();
}
公共接口IReadWriteRepository:IReadOnlyRepository
{
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! :(
公共类AccountRepository:IReadWriteRepository
{
公共void DoSomething(){/*BLAH*/}
公共void DoSomethingElse(){/*BLAH*/}
}
注册

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! :(
services.AddTransient();
分辨率

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! :(
provider.Resolve();//成功:)
provider.Resolve();//失败!:(

依赖项注入不是这样工作的。如果您想
IReadOnlyRepository
解析为
AccountRepository
,您也必须注册它

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

否则,DI容器将如何知道要生成什么。想象一下,您心目中的实际工作情况,如果您要求它解析
IDisposable
IEnumerable
,会发生什么情况?它无法神奇地知道您需要什么,您必须明确说明。

服务是简单的字典-以抽象类型为键,您需要显式注册另一个抽象以将其添加到字典中。这没有真正的意义。如果您要求
IDisposable
IEumerable
,并且您注册了多个满足此解决方案的内容,我预计会失败,但在这种情况下,DI可能会解决此问题。您是否有这方面的任何文档?我找不到任何引用此问题的内容。因此,我创建了此问题。@GerardWilkinson这是可能的……但DI并不是建立在这样一个事实上的,即在您的例外情况下,它可能是可能的。一般来说,将DI解析为它必须自己确定的类型将是一个令人困惑的噩梦。DI有与类型系统或继承有关。这是一个简单的查找。是您需要注册的类型。很好。不是吗?错误。这不会真的是一个令人困惑的噩梦。它应该如何编写,您有一个相当简单的继承树来导航。这也不是一个例外情况。读写sepa完全合理评级为明确标记代码中的此位置没有编辑…无论如何感谢您的帮助。我主要是想知道为什么这不起作用。注册两次没有任何问题,只是如果DI构建正确,它已经可以做到了。