2010-05-14 5 views
1

J'ai la conception de classe abstraite suivante, je me demandais si quelqu'un peut suggérer des améliorations en termes de renforcement de l'application de nos exigences ou en simplifiant l'implémentation de la ControllerBase.Améliorer cette classe abstraite générique

//Dependency Provider base 
public abstract class ControllerBase<TContract, TType> where TType : TContract, class 
{ 
    public static TContract Instance 
    { 
     get { 
    return ComponentFactory.GetComponent<TContract, TType>(); 
      } 
    } 

public TContract GetComponent<TContract, TType>() where TType : TContract, class 
{ 
     component = (TType)Activator.CreateInstance(typeof(TType), true); 
     RegisterComponentInstance<TContract>(component); 
} 
} 

//Contract 
public interface IController 
{ 
void DoThing(); 
} 

//Actual Class Logic 
public class Controller: ControllerBase<IController,Controller> 
{ 
public void DoThing(); 

    //internal constructor 
    internal Controller(){} 

} 


//Usage 
public static void Main() 
{ 
Controller.Instance.DoThing(); 
} 

Les faits suivants doivent toujours être vrai,

  • TType doit toujours mettre en œuvre TContract (Enforced utilisant une contrainte générique)

  • TContract doit être une interface (Vous ne trouvez pas un manière de l'appliquer)

  • TType ne devrait pas avoir de constructeur public, seulement un constructeur interne, y a-t-il un moyen d'appliquer cela en utilisant ControllerBase?

  • TType doit être une classe concrète (N'a pas d'éléments nouveaux() comme générique Contraindre étant donné que les constructeurs devraient être marqués comme interne)

+1

L'exécution de TContract en tant qu'interface semble être un non-sens. Ne vous méprenez pas, mais les interfaces ne peuvent pas être instanciées. Comprenez-les comme de simples contrats, rien de plus, ils n'appliquent (principalement) que des comportements. Mais ce ne sont pas des types, ni des classes. Vous devriez essayer d'expliquer pourquoi vous voulez que ce soit l'interface. –

+0

Désolé, je ne sais pas pourquoi j'ai dit interface, je voulais dire classe abstraite –

+0

Voulez-vous expliquer pourquoi cela ne fonctionnerait pas? –

Répondre

0

Il est un moyen d'appliquer TTYPE étant une classe concrète et interdire le succès du constructeur en même temps. Je suppose qu'il pourrait être possible d'essayer d'instancier TType, qui ne réussira que s'il s'agit d'un type concret, cependant, vous voulez éviter l'instanciation. Je suggère d'essayer de lancer une exception du constructeur. Dans votre base de contrôleur, vous pouvez entourer l'instanciation avec le code de gestion des exceptions. Ceci n'obtiendra le temps de compilation que si vous instanciez le type concret et qu'il passera à l'exécution si vous lancez une exception ... C'est globalement une mauvaise pratique (si possible) et je suppose que vous avez besoin d'un design totalement différent pour réaliser ce que vous recherchez .

Questions connexes