1 votes

C# Dependency Injection Cast Issue

J'ai plusieurs classes qui mettent en œuvre la même interface.

interface IBidManager<E> where E : IEntity

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

Dans mon cours de gestion d'entreprise, j'ai :

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

Dans le BusinessManager, il y a une fonction que j'appelle pour 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 une interface vide que j'utilise avec mes classes POCO générées par un t4 et le framework Entity.

J'aurais pu jurer que ça marchait, mais j'ai réessayé et il y a une erreur qui dit :

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

Lorsque je supprime (IBidManager), Visual Studio me dit qu'une conversion explicite existe... mais de quoi s'agit-il ?

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;

De plus, je ne peux pas créer une fonction dans le gestionnaire d'entreprise qui prend un fichier de type IBidManager<E> étant donné qu'il s'agit d'une application asp.net à n couches et que je ne veux pas que la couche UI sache quoi que ce soit sur l'IBidManager.

1voto

Mark H Points 9127

Si vous pouvez utiliser .Net 4.0, vous pouvez résoudre votre problème de cast via la covariance.

interface IBidManager<out E> where E : IEntity.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X