2009-10-05 7 views
0

Je ne suis pas sûr de savoir comment faire cela.Comment vérifier bool entrant et définir le champ privé pour ensuite être envoyé au constructeur de base

L'objectif: Je veux vérifier la bool useWebServiceConnection entrant (comme vous le voyez ci-dessous) et définissez le champ connectionString privé avant de le transmettre au constructeur de base en fonction useWebServiceConnection pour régler la connectionString.

Je pense que le constructeur de classe de base est appelé d'abord toujours droit? Donc ça ne va pas marcher.

En ce moment, je reçois aussi "Impossible d'accéder à la propriété statique dans le contexte statique" pour cette ligne:

public ProjectDB(bool useWebServiceConnection) : base(connectionString) 

CLASSE DE BASE:

public class DatabaseBase { chaîne readonly privée connectionString; usage privé de boolCounters; Public DatabaseBase (chaîne connectionString) { this.connectionString = connectionString; }

CLASSE DÉRIVÉS:

La classe dérivée a d'abord travaillé comme ça avant que j'ai changé ce que vous voyez ci-dessus (nous avons eu fonctionner comme ça jusqu'à ce que la nécessité de vérifier un bool et le changement chaînes de connexion en cas de besoin):

public class ProjectDB : DatabaseBase 
{ 

    readonly static string connectionString = ConfigurationManager.AppSettings["SomeOtherConnectionString"]; 

    public ProjectDB() : base(connectionString) 
    { 
    } 

    private SqlConnection CreateConnection() 
    { 
     return new SqlConnection(connectionString); 
    } 

MIS à JOUR: Voici ce que je suis venu avec. Regardez le rapport d'origine que j'ai essayé contre ce que je suis venu avec base de votre aide:

public class ProjectDB : DatabaseBase 
{ 
    readonly static string connectionString = ConfigurationManager.AppSettings["SomeOtherConnectionString"]; 

    private bool useWebServiceConnection; 

    private bool isWebServiceCall; 

    public ProjectDB() : base(connectionString) 
    { 
    } 

    public ProjectDB(bool useWebServiceConnection) : base(useWebServiceConnection 
      ? ConfigurationManager.AppSettings["ServiceConnectionString"] 
      : ConfigurationManager.AppSettings["SomeOtherConnectionString"]) 
    { 

    } 

Notez que j'ai un champ connectionString locale dans la classe dérivée. C'est ainsi que le code existant peut simplement appeler et instancier ProjectDB() sans passer aucune valeur et cela signifie qu'il utilisera simplement la chaîne de connexion DB par défaut "SomeOtherConnection" comme elle est initialisée en haut de la classe dérivée comme vous pouvez le voir.

Nous avons également le deuxième constructeur surchargé maintenant. Avec votre aide, maintenant j'ai la possibilité de spécifier s'il faut utiliser une chaîne de connexion de service spécial lorsque je crée un nouvel objet ProjectDB.

Je pense que c'est une bonne solution. Si ce n'est pas le cas, ou si vous avez une meilleure implémentation, informez-moi, mais j'ai appris de bonnes idées et je ne savais pas que je pourrais transmettre ce paramètre du constructeur local au constructeur de base, merci beaucoup ... maintenant je sais. Une chose cependant, je n'ai pas vraiment besoin d'un backing field local useWebServiceConnection maintenant que je viens de le passer au constructeur de ma classe de base.Donc, cela vient donc obsolète je l'ai enlevé du constructeur:

this.useWebServiceConnection = useWebServiceConnection; 

Répondre

1

Essayez ceci:

public class DatabaseBase 
{ 
    private readonly string connectionString; 
    private bool useCounters; 

    public DatabaseBase(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public string ConnectionString 
    { 
     get { return connectionString; } 
    } 
} 

public class ProjectDB : DatabaseBase 
{ 
    private bool useWebServiceConnection; 
    private bool isWebServiceCall; 

    public ProjectDB(bool useWebServiceConnection) 
     : base(
      useWebServiceConnection 
       ? ConfigurationManager.AppSettings["ServiceConnectionString"] 
       : ConfigurationManager.AppSettings["SomeOtherConnectionString"]) 
    { 
     this.useWebServiceConnection = useWebServiceConnection; 
    } 

    private SqlConnection CreateConnection() 
    { 
     return new SqlConnection(ConnectionString); 
    } 
} 
+0

alors quel est le point de régler this.useWebServiceConnection = useWebServiceConnection; si j'ai satisfait à mes exigences en envoyant le chèque en tant que param au constructeur de la base? – PositiveGuy

+0

Je viens de partir parce que vous l'aviez là. Je pensais que vous pourriez avoir une utilisation future pour cela prévu. Je supprimerais si j'étais vous, car il peut être ajouté en arrière si nécessaire. –

0
public ProjectDB(bool useWebServiceConnection) 
    : base(ConfigurationManager.AppSettings[useWebServiceConnection ? "ServiceConnectionString" : "SomeOtherConnectionString"]) 
{ 
    this.useWebServiceConnection = useWebServiceConnection; 
} 
+0

ne pas aimer cette approche. Je veux d'abord le régler sur une variable pour faciliter le débogage et cela a l'air long. – PositiveGuy

+0

En outre, le paramètre useWebServiceConnection n'est-il pas utilisé après l'appel de la base? Donc, useWebServiceConnection ne serait même pas encore défini? – PositiveGuy

+0

@coffeeaddict: S'il se comporte comme C++, il sera valide car il est passé en tant qu'élément du constructeur. Il n'a pas utilisé this.useWebServiceConnection. –

0

La base doit être construit avant la classe dérivée que la dérivée peut dépendre de cela. Il y a quelques approches que vous pouvez prendre ici:

  1. offre un setter pour la valeur et ont les dérivés définir.

  2. Faites en sorte que la propriété connectionString soit protégée afin que le dérivé puisse la définir directement et autoriser le constructeur par défaut.

  3. Externaliser les informations dans les paramètres de l'application et les récupérer au besoin plutôt que de les transporter dans les classes.

  4. Ajoutez-le également au constructeur dérivé. Bien sûr, cela change un peu le flux, vous devez décider en dehors de votre classe.

+0

(Externaliser les informations dans les paramètres de l'application). Je ne peux pas simplement le configurer en externe, ce n'est pas une situation de scénario unique, c'est pourquoi je vérifie le drapeau pour déterminer quelle chaîne de connexion doit passer à la base. Et je ne reçois pas votre # 1 ou # 3. setter sur quoi? J'ai besoin de – PositiveGuy

+0

Je veux que useWebServiceConnection soit défini via un constructeur afin que personne ne puisse le manquer. Et je veux que la connectionString soit passée à la base pour être définie en fonction de la logique qui vérifie UseBoolWebServiceConnection. – PositiveGuy

+0

@coffeeaddict: Alors je pense que l'option 1 ou 2 est ce que vous avez. Personnellement, j'irais avec 2 à moins qu'il y ait une raison impérieuse de ne pas autoriser la classe dérivée à utiliser la chaîne de connexion. –

Questions connexes