1

J'ai plusieurs classes qui implémentent la même interface.Casting d'injection de dépendance C# Problème

interface IBidManager<E> where E : IEntity 

public class BidManager : IBidManager<EntityObject1> 
public class BidManager2 : IBidManager<EntityObject2> 
public class BidManager3 : IBidManager<EntityObject3> 

Dans ma classe de chef d'entreprise je:

public class BusinessManager : ManagerBase 
{ 
    private IBidManager<IEntity> _bidLogicManager; 
    ... 

Dans BusinessManager est une fonction que j'appelle à changer le _bidLogicManager (MyType est un ENUM)

public void SetLogic(MyType auctionType) 
{ 
    switch (MyType) 
    { 
     case AuctionType.Classic: 
      _bidLogicManager = (IBidManager<IEntity>)new BidManager(); 
      break; 
    ... 

IEntity est un interface vide que j'utilise avec mes classes POCO générées par un t4 et le framework Entity.

je aurais pu juraient ce fonctionnait, mais je l'ai essayé à nouveau et son erreur de lancer sayng:

Unable to cast object of type 'BLL.MyManagers.BidManager' to type 'BLL.BidManagers.IBidManager`1[Entities.IEntity]'. 

Lorsque je retire (IBidManager) visual studio me dit qu'il existe une conversion explicite ... mais ce est-ce?

Je ne veux pas définir le type lors de la création de la classe BusinessManager comme ceci:

public class BusinessManager<E> : ManagerBase where E : class, IEntity 
{ 
     IBidManager<E> _bidLogicManager; 

Aussi, je ne peut pas créer une fonction dans le chef d'entreprise qui prend un argument IBidManager<E> puisque c'est une couche n application asp.net et je ne veux pas que la couche UI sache rien sur le IBidManager

Répondre

1

Si vous pouvez utiliser .Net 4.0, vous pouvez résoudre votre problème de moulage par covariance.

interface IBidManager<out E> where E : IEntity. 
+0

Oui, ça a fonctionné! Je pensais que cela prendrait seulement 3 lettres pour le résoudre lol. Merci! –