2009-06-09 8 views
2

J'ai un vieux gâchis que j'essaie de pelleter en niveaux subsoniques. Le problème est, j'ai ce scénario:Subsonic: connexions dynamiques

Lorsque Hal se connecte, son login utilise la base de données X pour les données de recherche, la base de données Y pour ses comptes et la base de données Z pour ses contacts. Lorsque Barry se connecte, son identifiant utilise la base de données X pour la recherche, la base de données Q pour ses comptes et la base de données R pour ses contacts.

X, Y, Z, Q et R sont tous sur le même serveur. Y a un schéma indentical à Q, et et Z a un schéma identique à R. Ne me lancez pas sur la façon dont c'est une installation stupide :)

Je dois créer mon application .NET Winforms (en utilisant subsonic) pointez vers les bases de données correctes. Pour autant que je sache, je vais devoir me salir les mains en changeant la source SubSonic (et maintenir ces changements avec chaque version subsonique), donc il peut accepter les paramètres plutôt que d'utiliser app.config. Quelqu'un peut-il voir une alternative à cela?

Répondre

1

Merci les gars. J'ai déjà travaillé sur les multiples fournisseurs, mais je ne savais pas comment les définir au moment de l'exécution (et j'ai déjà cherché sur ce forum.) J'ai dû utiliser les mauvais mots clés.

SharedDBConnectionScope semble parfait pour le vol, mais ne semble pas conçu pour définir le fournisseur pour toute la session de l'utilisateur.

Je ne plus la recherche en fonction de vos réponses ci-dessus, et est venu avec la solution suivante:

1) Ajouter trois fournisseurs, comptes pour LookUps et contacts, et générer le DAL.

2) ajouter à la DAL:

public static void SetProvider(string strProvider,string strConnectionString) 
{ 
    DataService.GetInstance(strProvider).DefaultConnectionString = 
                strConnectionString; 
} 

3) appeler à la connexion, une fois que mon application a élaboré quelles bases de données que l'utilisateur utilise, par exemple

MyDAL.SSProvider.SetProvider("Lookups", 
      "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=X") 

MyDAL.SSProvider.SetProvider("Accounts", 
     "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Y") 

MyDAL.SSProvider.SetProvider("Contacts",  
       "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Z") 

Et c'est parti .

+0

Je voulais juste suivre ce poste avec mes propres expériences, TheVillageIdiot c'est celui qui a fonctionné pour moi !!! – jonezy

+0

J'écris un billet de blog et je vais le faire ici avec une explication plus détaillée de la façon dont j'ai implémenté la solution TheVillageIdiots – jonezy

1

Vous ne devriez pas avoir besoin de modifier la source, vous devriez simplement pouvoir utiliser plusieurs fournisseurs pour converser avec les différentes bases de données et basculer entre eux à l'exécution. Jetez un oeil à la question suivante pour voir comment faire:

Separate Read/Write Connection for SubSonic

1
  1. Subsonic peut créer un dal pour plusieurs bases de données. Ajoutez simplement un fournisseur faisant référence à une autre chaîne de connexion à votre app.config. Modifiez l'espace de noms pour chaque fournisseur.

Maintenant, vous devriez être en mesure d'accéder: My.Namespace.R ... My.Namespace.X ...

  1. Vous pouvez facilement changer connexion à la volée:

    using (SharedDbConnectionScope scope = new SharedDbConnectionScope("new connectionstring ")) 
    { 
    } 
    

Si vous n'avez pas besoin de plus d'une connexion à la fois, cela est possible aussi. Nous utilisons pour la fermeture de session et l'ouverture de session à un autre serveur (Un autre effet secondaire est que vous n'avez pas besoin d'avoir une app/web.config

à cet exemple ici. http://www.digvijay.eu/post/2008/10/30/SubSonic-Trick-Specify-connection-string-at-runtime!.aspx

Chaque fois que vous appelez InitSubsonic la connexion est modifiée.

public class MySubsonicProvider 
{ 

    private static bool _bIsInitialized = false; 

    public static void InitSubsonic(string server, string schema, string user, string password) 
    { 

     DataService.Providers = new DataProviderCollection(); 

     // here you can get settings from anywhere and make up a connection string :) 
     MyDataProvider provider = new MyDataProvider("Server={0};Database={1};Uid={2};Password={3}", server, schema, user, password); 
     DataService.Providers.Add(provider); 
     DataService.Provider = provider; 

     _bIsInitialized = true; 

     // Clear cached values 
     ClearSubSonicCache(); 

    } 

    public class MyDataProvider : MySqlInnoDBDataProvider 
    { 

     private string _server; 
     private string _schema; 
     private string _user; 
     private string _password; 

     public string Server { get { return _server; } } 
     public string Schema { get { return _schema; } } 
     public string User { get { return _user; } } 
     public string Password { get { return _password; } } 

     public MyDataProvider(string connectionString, string server, string schema, string user, string password) 
     { 
      DefaultConnectionString = String.Format(connectionString, server, schema, user, password); 

      _server = server; 
      _schema = schema; 
      _user = user; 
      _password = password; 

     } 

     public override string Name 
     { 
      get { return "MyDataProvider"; } 
     } 

    } 
} 
2

J'ai jamais considéré avoir «SharedDbConnectionScope facile ou adapté à mes applications

Pourtant, c'est la réponse est non? C'est pourquoi nous l'avons mis là - et oui j'ai entendu vos demandes de connexion changer à la volée et je l'ai intégré, comme je vous le répète dans chaque fil que nous avons.Changer les connexions à la volée est une demande que nous avons eu depuis longtemps, et nous l'avons ajoutée il y a longtemps - et autant que je sache, cela fonctionne comme un charme.

Pour SubSonic 3, je branchais environ 10 façons différentes de changer la connexion de votre base de données quand vous voulez, quelle que soit la plate-forme que vous voulez, quel que soit l'objet que vous voulez.

1

Un autre exemple de changement de fournisseur à la volée (lors de l'exécution). Celui-ci lit les éléments d'une base de données et les enregistre dans une autre.

Utilisation:

CopyToAnotherDB<Dock>(Dock.Columns.Id, Dock.BarcodeStringColumn); 

Méthode:

public static void CopyToAnotherDB<E>(string identifierColumnName, TableSchema.TableColumn fakeDirtyColHack) 
     where E : ActiveRecord<E>, new() 
    { 
     SqlQuery q = new Select().From<E>(); 
     q.ProviderName = SERVU_PROVIDER; 
     IList<E> list = q.ExecuteTypedList<E>(); 

     string connStr = ConfigurationManager.ConnectionStrings[ARCHIVE_PROVIDER].ConnectionString; 
     using (SharedDbConnectionScope scope = new SharedDbConnectionScope(connStr)) 
     { 
      foreach (E item in list) 
      { 
       int itemID = (int)item.GetColumnValue(identifierColumnName); 
       SqlQuery qry = new Select(identifierColumnName).From<E>().Where(identifierColumnName).IsEqualTo(itemID); 
       int recCount = qry.GetRecordCount(); 
       E obj = item.Clone(); 

       obj.IsNew = recCount == 0; //determines if adding or updating 
       obj.IsLoaded = !obj.IsNew; //determines if adding or updating 
       obj.DirtyColumns.Add(fakeDirtyColHack); 
       obj.Save(); 
      } 
     } 
    }