我正在尝试使用SimpleInjector实现延迟初始化并使用Generics我在AService.cs中发送错误,同时在基础构造函数中发送Lazy。我已经读过Lazy不支持协方差,但我的问题是如何使用IoC和Lazy使用泛型。
AService.cs
public class AService : GenericService, IAService
{
private readonly Lazy<IARepository> aRepository;
public AService(Lazy<IARepository> aRepository) : base(aRepository)
{
this.aRepository = aRepository;
}
}
IAService.cs
public interface IAService : IGenericService
{
}
IGenericService.cs
public interface IGenericService
{
void DoSomething();
}
GenericService.cs
public class GenericService : IGenericService
{
private readonly Lazy<IGenericRepository> genericRepository;
public GenericService(Lazy<IGenericRepository> genericRepository)
{
this.genericRepository = genericRepository;
}
public void DoSomething()
{
genericRepository.Value.DoSomething();
}
}
简单注射器中的绑定
container.Register<Lazy<IARepository>>(
() => new Lazy<IARepository>(container.GetInstance<ARepository>));
container.Register<Lazy<IBRepository>>(
() => new Lazy<IBRepository>(container.GetInstance<BRepository>));
container.Register<Lazy<IAService>>(
() => new Lazy<IAService>(container.GetInstance<AService>));
答案 0 :(得分:1)
这在这里得到解答:
How to downcast an instance of a Generic type?
TL; DR:
在这种情况下,编译器无法知道
Bar<T>
可以转换为Bar<Foo>
,因为它通常不正确。你必须通过在两者之间引入一个对象来“欺骗”:
return new FooBar<Foo>( (Bar<Foo>)(object) bar);
所以你应该能够做到这一点:
public AService(Lazy<IARepository> aRepository) : base((Lazy<IGenericRepository>)(object)aRepository) { }