无法从System.Lazy <iarepository>转换为System.Lazy <igenericrepository>

时间:2017-01-12 06:23:29

标签: c# generics inversion-of-control repository-pattern lazy-initialization

我正在尝试使用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>));

1 个答案:

答案 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) { }