De mon expérience personnelle, c'est une approche Rocksolid:
- vous empêchent instanciation de plus d'une instance de DataSet
- Vous avez globalement disponible, ce qui est ce que vous voulez et rend la vie facile
Cependant, POO-Zélotes argueront que vous ne devriez pas utiliser un gang classique de quatre Singleton (avec la propriété statique instance), mais un DI Singleton, un objet qui est créé par le conteneur DI une seule fois, puis passé partout.
Personnellement, je pense que c'est un compromis: le GoF Singleton est facile à utiliser et simple. Je n'ai jamais eu un cas où je devais le remplacer ou l'accès à la base de données en général. J'ai une interface pour l'accès à la base de données et en cas de besoin je pourrais changer l'implémentation dans le Singleton (et l'améliorer, de sorte que cela soit possible même pendant l'exécution). Il peut également vous faire économiser beaucoup de code standard, mais gardez à l'esprit que votre modèle est alors très étroitement couplé à la base de données et ne peut pas exister sans elle. Le seul avantage des choses DI que je peux voir est que vous pouvez le configurer à partir d'une config externe car je doute que la gestion du cycle de vie de votre accès à la base de données changera, ce qui serait l'autre avantage de DI. Et votre ObjectModel pourrait être maintenu propre à long terme (plus pour les grands projets). Personnellement, j'aime utiliser cette implémentation générique de Singleton. Certains fétichistes d'objets diront que c'est plus un wrapper qu'un singleton, mais cela fait du bon travail et vous permet même de garder vos ObjectModels ("par opposition à ViewModels", ne vous méprenez pas) purs comme vous n'en avez pas besoin pour les mettre en œuvre singletons avec les membres statiques:
public class Singleton<T> where T : class {
static object SyncRoot = new object();
static T instance;
public static T Instance {
get {
if (instance == null) {
lock (SyncRoot) {
if (instance == null) {
ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (ci == null) { throw new InvalidOperationException("class must contain a private constructor"); }
instance = (T)ci.Invoke(null);
}
}
}
return instance;
}
}
}
http://www.sanity-free.com/132/generic_singleton_pattern_in_csharp.html
Merci, le singleton générique ressemble à un outil utile. Conseilleriez-vous l'utilisation d'un singleton, par exemple, en exposant l'ensemble de données via une propriété statique sur la classe d'application principale? – Moonshield
Si vous pouvez dire: Ma classe d'application (qui est probablement une classe statique ou un singleton) est une dépendance obligatoire pour chaque classe de modèle, alors la propriété static est correcte mais pas recommandée. Le singleton générique vous permet de coupler des classes de modèles spécifiques uniquement à l'instance singlet-dataset (si vous voulez l'avoir comme Singleton, c'est-à-dire) et vous pouvez également l'utiliser sans classe d'application. Donc, je recommande le singleton. Votre décision devrait être prise par la complexité de votre application, car la force de la propriété statique est sa simplicité. – Falcon
Merci, je vais y réfléchir. – Moonshield