我有一个相当简单的存储库设计设置。使用 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/