DI无法从子接口解析基础接口

时间:2019-05-31 10:52:53

标签: c# dependency-injection

对于存储库设计,我有一个非常简单的设置。使用DI解析控制器构造函数中的存储库。

但是,DI的表现却很奇怪。它似乎无法解决依赖关系,该依赖关系已解决为注册接口的基础。我相信它应该能够做到这一点,因为任何满足子接口的类型也必须满足基本要求。

有兴趣知道是否有人知道为什么会这样吗?

示例:

基本界面

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

子界面

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! :(

1 个答案:

答案 0 :(得分:3)

那不是依赖注入的工作原理。如果您希望IReadOnlyRepository<Account>解析为AccountRepository,则也必须注册。

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

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