对于存储库设计,我有一个非常简单的设置。使用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! :(
答案 0 :(得分:3)
那不是依赖注入的工作原理。如果您希望IReadOnlyRepository<Account>
解析为AccountRepository
,则也必须注册。
services.AddTransient<IReadOnlyRepository<Account>, AccountRepository>();
否则,DI容器将如何知道生成什么。想象一下您的想法实际上会起作用,如果您要求它解决IDisposable
或IEnumerable
会发生什么?它无法神奇地知道您的需求,必须明确。