0

J'essaye d'obtenir une initialisation paresseuse avec SimpleInjector et en utilisant Generics, je reçois une erreur dans mon AService.cs lors de l'envoi de Lazy dans le constructeur de base. J'ai lu que Lazy ne supporte pas la covariance, mais ma question est comment obtenir une solution de contournement pour utiliser des génériques avec IoC et Lazy.Impossible de convertir System.Lazy <IARepository> en System.Lazy <IGenericRepository>

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(); 
    } 
} 

Manchettes à Injector simple

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

double possible: http: //stackoverflow.com/questions/21117619/covariant-use-of-generic-lazy-class-in-c-sharp – Michael

+0

Voir aussi https://msdn.microsoft.com/fr-fr/library/dd799517(v= vs.110) .aspx – Michael

Répondre

1

Ceci est la réponse ici:

How to downcast an instance of a Generic type?

tl; dr:

Le compilateur ne peut pas savoir que Bar<T> peut être jeté à Bar<Foo> dans ce cas, parce que ce n'est généralement pas vrai. Vous devez "tricher" en introduisant un casting d'opposition entre:

return new FooBar<Foo>((Bar<Foo>)(object) bar);

Donc, vous devriez être en mesure d'atteindre cet objectif en faisant:

public AService(Lazy<IARepository> aRepository) : base((Lazy<IGenericRepository>)(object)aRepository) { }

+0

Impossible de convertir un objet de type 'System.Lazy'1 [Services.Repos.IAR epository] 'pour taper' System.Lazy'1 [Services.Repos.IGenericRepository] '. – BilalArshad