2010-06-30 6 views
4

J'ai 3 classes: A, B et CC# Dépendance problème d'injection

Toutes ces classes implémentent une interface IMyInterface

Je voudrais l'interface à définir comme ceci:

internal IMyInterface<E> where E: class 
{ 
    E returnData(); 
} 

Pour pouvoir retourner des données de type E. Le type "E" sera un objet POCO créé avec Entity Framework v4.

Dans une classe séparée J'ai:

public class MyClass() 
{ 
    IMyInterface<??> businessLogic; 

    public setBusinessLogic(IMyInterface<E> myObject) 
     where E : class 
    { 
     businessLogic = myObject; 
    } 
} 

J'ai essayé de mettre en place <object> de <??> mais il ne pouvait pas jeter mon type d'entité poco.

J'ai essayé avec mes entités à mettre en œuvre une interface vide IEntity puis en utilisant

IMyInterface<IEntity> businessLogic; 
... 
businessLogic = new A<POCOObject>(); 

résultats dans:

Cannot implicitly convert type 
'A<POCOObject>' to 
'IMyInterface<IEntity>'. An explicit 
conversion exists (are you missing a 
cast?) 

Toutes les recommandations?

Edit: J'ai essayé de déclarer mes A, B et C comme des classes:

internal class A : IBidManager<EntityObjectType> 

et

internal class A<E> : IBidManager<E> where E : class 

résultats dans la même erreur.

Répondre

4

Il devra être soit

public class MyClass<E> where E : IEntity, class 
{ 
    IMyInterface<E> businessLogic; 

    public setBusinessLogic(IMyInterface<E> myObject) 
    { 
     businessLogic = myObject; 
    } 
} 

ou

public class MyClass 
{ 
    IMyInterface<POCOObject> businessLogic; 

    public setBusinessLogic(IMyInterface<POCOObject> myObject) 
    { 
     businessLogic = myObject; 
    } 
} 

Si vous wnt votre objet métier pour gérer tout objet POCO et ils ont chacun une interface, vous devrez spécifier where E : class, IEntity à le niveau de la classe. Sinon vous avez yo utiliser le type concret pour l'argument générique

+0

Hrmm initialement cela fonctionnait quand je viens de faire IBidManager businessLogic; alors fait businessLogic = (IBidManager ) new A(); .... mais pour une raison quelconque, il ne fonctionne plus ... –

+0

Bien que les solutions ci-dessus fonctionnent, je ne peux pas les faire de cette façon. Dans le premier exemple, vous utilisez dans la définition de classe. Notre système n'est pas configuré pour fonctionner de cette façon. Je veux créer une classe, puis appeler une fonction pour modifier l'objet IMyInterface pour référencer autre chose. Dans le second exemple ce n'est pas dynamique, le POCOObject est différent pour A, B et C –

+0

Il me dit qu'une conversion explicite existe ... hrmm –