2010-04-16 9 views
1

J'ai dit une douzaine de types T qui héritent de EntityObject et IDataObject. je générique l'interface suivanteLocalisateur de service pour les génériques

IDataManager<T> where T : EntityObject, IDataObject ... 

J'ai aussi classe de base pour les gestionnaires de données

BaseDataManager<T> : IDataManager<T> where T : EntityObject, IDataObject .... 

Et j'ai des classes particulières

public class Result : EntityObject, IDataObject .... 

public class ResultDataManager : BaseDataManager<Result> ... 

Je veux mettre en œuvre localisateur de service, qui retour instance de IDataManager<T> pour T

Mais j'ai collé comment l'implémenter de manière ordonnée sans beaucoup de castings.

Des idées?

MISE À JOUR: Je l'habitude d'utiliser le code suivant pour découvrir les types pour les ENREGISTRER avec mon précédent localisateur de service:

foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) 
      { 
       if (type.GetInterface("ISQLDataAccessManager") != null && !type.IsAbstract) 
       { 
        var manager = (ISQLDataAccessManager)Activator.CreateInstance(type); 

        _managers.Add(type, manager); 

        var typeDO = manager.GetDataObjectType(); 

        _typeNames2Types.Add(typeDO.FullName, typeDO); 
        _managers2BO.Add(typeDO, manager); 
       } 
      } 

Il semble que je ne comprends pas vraiment la réflexion avec les génériques

+0

demandez-vous comment trouver les instances singleton de datamanagers déjà créé ? – dthorpe

+1

Aussi, pourquoi avez-vous un type param sur votre ResultDataManager? Je pense que ce serait un type concret: classe publique ResultDataManager: BaseDataManager ... – dthorpe

+0

@dthorpe: bon point sur le type de retour: je veux obtenir ResultDataManager qui implémente BaseDataManager vittore

Répondre

3

ici est une solution propre si le localisateur ayant comme singleton est très bien:

static class Locator 
{ 
    private static class LocatorEntry<T> where T : ... 
    { 
     public static IDataManager<T> instance; 
    } 

    public static void Register<T>(IDataManager<T> instance) where T : ... 
    { 
     LocatorEntry<T>.instance = instance; 
    } 

    public static IDataManager<T> GetInstance<T>() where T : ... 
    { 
     return LocatorEntry<T>.instance; 
    } 
} 

Si vous ne pouvez pas mettre en œuvre le localisateur comme singleton, je démentent ve il n'y a pas là autour de la création d'un dictionnaire < type, objet > et faire des moulages:

class Locator 
{ 
    private readonly Dictionary<Type, object> instances; 

    public Locator 
    { 
     this.instances = new Dictionary<Type, object>(); 
    } 

    public void Register<T>(IDataManager<T> instance) where T : ... 
    { 
     this.instances[typeof(T)] = instance; 
    } 

    public IDataManager<T> GetInstance<T>() where T : ... 
    { 
     return (IDataManager<T>)this.instances[typeof(T)]; 
    } 
} 
+0

J'ai votre deuxième extrait en tête, mais était préoccupant que quelque chose échappe à mon esprit. Donc, si je ne peux pas faire mieux sans avoir des singletons - c'est la réponse – vittore

+0

Cependant, je vais essayer d'adopter votre premier extrait ... – vittore

+0

@dtb: mais pour un premier extrait comment découvrir tous les types héritant de 'IDataManager 'avec réflexion et les enregistrer? – vittore