Frage

Ich habe eine Web-Anwendung, die folgende umfasst:

  • Ein Web-Projekt (mit einer web.config-Datei eine Verbindungszeichenfolge enthält - aber kein Datenzugriffscode im Web-Projekt)
  • Ein Datenzugriff Projekt, die LINQ-SQL-Klassen verwenden Entitäten auf das Web-Projekt UI zur Verfügung zu stellen (das Projekt hat eine Einstellungsdatei und eine app.config - beide haben Verbindungszeichenfolgen)

Wenn ich erstellen und bereitstellen, gibt es keine Einstellungsdatei oder app.config im Verzeichnis Bin mit dem Datenzugriff .dll, aber ändert die Verbindungszeichenfolge in der Datei web.config die Datenbank nicht entsprechend ändern - so die Verbindungszeichenfolge muss in den Datenzugriff dll kompiliert werden.

Was ich brauche, ist eine Konfigurationsdatei für meine gesamte Einsatz - Webseite, Datenzugriff dlls, alles - die eine Verbindungszeichenfolge hat, die verwendet wird. Im Moment scheint es mehr Verbindungszeichenfolgen zu Gewöhnung oder ganz über den Platz fest einprogrammiert.

Wie kann ich am besten lösen dieses Chaos?

Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Ich habe noch nie ein Problem mit den Data Access Layer (DAL) in der Lage, die Verbindungszeichenfolgen aus meiner web.config-Datei zu verwenden. Normalerweise ich kopieren Sie einfach die Verbindungszeichenabschnitt von der DAL und fügen Sie ihn in die web.config. Ich bin mit dem DBML Designer des Datenkontext zu erstellen.

Wenn dies nicht für Sie arbeiten, können Sie die Verbindungszeichenfolge in den Datenkontext Konstruktor angeben. In Ihrem Web-Projekt hat eine statische Klasse, die Ihre Einstellungen lädt, Ihre Verbindungszeichenfolgen einschließlich, und wenn Sie Ihr DAL-Objekt erstellen (oder Datenkontext, wenn es direkt zu schaffen) übergeben Sie es nur in dem an den Konstruktor.

public static class GlobalSettings
{
    private static string dalConnectionString;
    public static string DALConnectionString
    {
       get
       {
           if (dalConnectionString == null)
           {
              dalConnectionString = WebConfigurationManager
                                      .ConnectionStrings["DALConnectionString"]
                                        .ConnectionString;
           }
           return dalConnectionString;
       }
    }
}
...

using (var context = new DALDataContext(GlobalSettings.DALConnectionString))
{
   ...
}

Andere Tipps

Die Konfigurationsdatei für das Startprojekt werden die Konfigurationseinstellungen für alle enthaltenen Projekte definieren. Zum Beispiel, wenn Ihr Webprojekt das Startprojekt ist jede Bezugnahme auf „appSettings“ für Einstellungen von web.config aussehen wird, schließt dies alle Verweise auf „appSettings“ aus dem Datenzugriff Projekt. So kopieren Sie alle Konfigurationseinstellungen aus dem app.config Data Access-Projekt auf den web.config des Webprojekts.

Bewegen Sie Ihre eigene ConnectionFactory- auf der Grundlage der Registry:

  • fügen Sie einen Registrierungsschlüssel für Ihre Anwendung unter SOFTWARE / [YOUR_COMPANY] / [YOUR_APP]
  • fügen Sie einen String-Wert für Connection
  • Bringen Sie Ihren ConnectionFactory- den entsprechenden Registrierungsschlüssel zu knacken (in einem statischen Konstruktor, nicht jede Seite zu laden!).
  • exportieren Sie die Registrierungsinfo als REG-Datei, fügen Sie es zur Quellcodeverwaltung, modifizieren und wenden Sie es als notwendig, zusätzliche Maschinen einzurichten.

Pro:

  • Einfach einzurichten
  • Connection Leben an einem einzigen Ort
  • Nicht in web / app.config, so dass keine Notwendigkeit umgebungsspezifischen Einstellungen zu codieren.
  • Nicht in web / app.config, so Junior Dev Jimmy nicht versehentlich Produktionsserver sagen an der DEV-Datenbank suchen

Con:

  • Nicht sofort klar, dass wichtige Dinge in der Registrierung leben, so neue Entwickler werden Anweisungen benötigen.
  • Zusatzschritt, wenn eine neue Bereitstellung Maschine Konfiguration
  • Registry ist oldskool. Junior Devs werden Sie verspotten.

Danke für die Antworten.

Diejenigen von Ihnen, die App sagen wird die Einstellung in der web.config für Instanzen korrekt sind verwenden, wo ich es in meinem eigenen Code verweisen:

_connectionString = ConfigurationManager.AppSettings["ConnectionString"];

.. aber es gibt ein anderes Problem mit LINQ-SQL Datacontexts - ich denke, dass sie Verbindungen Strings in der kompilierten DLL für die Verwendung in dem parameterlosen Konstruktor enthalten. Wie tvanofosson sagt, ich brauche Datacontexts zu erstellen, um die Verbindungszeichenfolge in der web.config in einer Referenz indem. Das ist, wo ich in ein Gewirr bekommen:)

Ich hatte ein bisschen einen Kampf mit dieser zu Thema. Ich fand eine Lösung von c # partielle Klassendefinition und Erweiterung der Datacontext von DBML Designer erstellt. Diese Lösung ganz ähnlich tvanfosson Antwort. Was Sie tun müssen, ist teilweise Datacontext-Klasse erstellen mit Standardkonstruktors bekommen Connection von Einstellungen und in DBML Designer DC Eigenschaften Verbindung auf Keine eingestellt. Auf diese Weise Verbindungszeichenfolge wird in DLL nicht werden die kompilierte. Datacontext wird automatisch Verbindungszeichenfolge von web.config Connection Einstellungen erhalten. Ich habe nicht geprüft, ob dies mit app.config funktioniert auch, aber ich denke, es sollte funktionieren.

Hier ist Probe von Teil DC-Klasse:

namespace MyApplication {
    /// <summary>
    /// Summary description for MyDataContext
    /// </summary>
    /// 
    public partial class MyDataContext
    {
        public MyDataContext() :
            base(global::System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString, mappingSource)
        {
            OnCreated();
        }
    }
}

Ihre Bewerbung wird nur die Konfigurationseinträge in der web.config-Datei verwenden. Sie können so lange in der Datei web.config dll Konfigurationseinstellung setzen, wie sie Struktur sind richtig. Mein Beispiel ist VB spezifisch den My-Namespace verwenden, aber es gibt Ihnen die allgemeine Idee.

In der configSections paret der Konfigurationsdatei Sie einen Eintrag benötigen:

<configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <section name="YourAssembly.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup></configSections>

Dann in dem application Teil der Konfigurationsdatei legen Sie die Einträge für jede dll:

    <applicationSettings>
      <YourAssembly.My.MySettings>
        <setting name="DebugMode" serializeAs="String">
            <value>False</value>
        </setting>
      </YourAssembly.My.MySettings>
    </applicationSettings>  

Um es sicher zu halten von allem, was in der automatisch generierten Code, die Verbindungsinformationen in der OnCreated () -Methode des Datenkontextes außer Kraft setzen:

using System.Configuration;
namespace MyApplication 
{
    partial void OnCreated()
    {
        // attempt to use named connection string from the calling config file
        var conn = ConfigurationManager.ConnectionStrings["MyConnectionString"];
        if (conn != null) Connection.ConnectionString = conn.ConnectionString;
    }
}

Auf diese Weise der dbml Designer kann Verbindung Zeug seine Art und Weise tun (was nicht schön außerhalb eines Web-Projekts ist), aber Sie greifen endgültige Kontrolle über die Verbindung, wenn die Anwendung ausgeführt wird.

Hier ist ein Weg, um es zu betrachten. Welche Komponente sollte die Entscheidung darüber treffen, welche Datenbank zu verwenden? Es ist möglich, dass die Datenbank (oder zumindest die Verbindungszeichenfolge) in Zukunft ändern könnte. Entscheidet die Website, die Datenbank zu benutzen? Oder hat die DAL entscheiden?

Wenn Sie Entwickler haben, QA, UAT und prod Datenbanken, diese Verbindungszeichen Verwaltung ist von entscheidender Bedeutung.

Wenn die Website entscheidet, sollte es die Verbindungszeichenfolge von seinem web.config auf die DAL passieren. Wenn die Website nicht sollte wissen, oder egal, wo die Daten kommen, dann ist die Verbindungszeichenfolge gehört in der DAL.

Wie wäre es ein ConnectionFactory- Objekt definieren, die eine Enumeration als Parameter und liefern ein vollständig geformtes Verbindungsobjekt?

könnten Sie haben auch die Web-Anwendung die Verbindungszeichenfolge bereitstellen, wenn sie die Data Access-Projekt verwenden muss. Man könnte es Teil des Konstrukteurs machen.

Auch könnten Sie könnten nur Ihre eigene Logik schreiben eine Verbindungszeichenfolge aus einer externen Datei zu laden, wenn der Datenzugriff Projekt macht es Anrufe sind.

In einer perfekten Welt, ich glaube, Sie Datenschicht Refactoring würden Konfigurationseinstellungen über System.Configuration oder relevante Konstrukteuren / Fabriken zu holen. Das heißt, Sie müssen entweder ihre implizite Konfigurationsquelle oder explizit Verbindungen von seinem Host / Verbraucher neu zu verkabeln. Ein weiteres verwandtes Muster diese Art von Konstanten für die Zentralisierung ist eine Nur-Lese-Eigenschaft in eine statische Hilfsklasse zu werfen und hat diese Klasse verwaltet die tatsächliche Auflösung von configs etc.

Ein Ort, den Sie sehen können, dass ich denke, zeigt gute Beispiele dafür, wie diese elegant zu tun ist, NHibernate und seine Konfiguration / Mappings Management. Zugegeben, es ist ein bisschen von xml Hölle und Fluent NHib ist süß, aber die meisten der realen Welt Proben zeigen Ihnen, wie Konfiguration aus einer Halteanordnung gegen Vollstreckungsanordnung in Einklang zu bringen.

Bewegen Sie Ihre eigene ConnectionFactory- basierend auf CONFIG-Dateien:

  • Definieren Sie eine benutzerdefinierte Konfiguration Abschnitt key / Connectionpaare zur Karte
  • Bringen Sie Ihre ConnectionFactory- in diesen Konfigurationsabschnitt zu schnuppern mit Hostnamen oder Computernamen gegebenenfalls
  • Bestücken key / Connection Werte für die verschiedenen dev / qa / prod Server, und legen Sie sie in Ihren verschiedenen app.config, web.config usw. Dateien.

Pro:

  • Alle Leben innerhalb des Projekts, also keine Überraschungen
  • Ziel zusätzliche Bereitstellung Hinzufügen ist eine copy / paste Operation in einer CONFIG-Datei

Con:

  • Sorgt für große hässliche XML Abschnitte, vor allem wenn Sie ein Dutzend Produktionsserver haben
  • Anforderungen werden zwischen Projekten kopiert
  • Anforderungen Codeänderung & umschichten neues Ziel hinzuzufügen
  • Code muss über die Umwelt kennen, in dem sie leben werden

Ich weiß, das ist alt, aber hier ist, wie ich es (Ich mag @ Sebas Art und Weise, aber ich habe nicht versucht, das)

Dies setzt voraus, Ihre DBML Datei in einem eigenen Klassenbibliothek befindet, das ich es am bequemsten gefunden habe, wenn Entitäten und Datenzugriff über mehrere Websites und andere Klassenbibliotheken zu teilen. Es geht auch davon aus Sie Ihre Verbindungszeichenfolge die gleiche in jedem Projekt mit dem Namen haben. Ich benutze NAnt diese Einstellung vornehmen, wenn ich an verschiedene Umgebungen bereitstellen.

I basiert dieses auf der obersten Antwort oben von @tvanfosson -. Ein dickes Lob an dieser Typ

  1. Erstellen Sie Ihre eigene Basisklasse, die von LinqDataContext
  2. ableitet

Hier ist der VB-Code:

    Imports System.Configuration

Public Class CustomDataContextBase
    Inherits System.Data.Linq.DataContext
    Implements IDisposable

    Private Shared overrideConnectionString As String

    Public Shared ReadOnly Property CustomConnectionString As String
        Get
            If String.IsNullOrEmpty(overrideConnectionString) Then
                overrideConnectionString = ConfigurationManager.ConnectionStrings("MyAppConnectionString").ConnectionString
            End If

            Return overrideConnectionString
        End Get
    End Property

    Public Sub New()
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String)
        MyBase.New(CustomConnectionString)
    End Sub

    Public Sub New(ByVal connectionString As String, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

    Public Sub New(ByVal connection As IDbConnection, ByVal mappingSource As System.Data.Linq.Mapping.MappingSource)
        MyBase.New(CustomConnectionString, mappingSource)
    End Sub

End Class
  1. Öffnen Sie Ihre DBML-Datei und in den Eigenschaften, die oben Klassennamen der Basisklasse Eigenschaft hinzuzufügen.

Beachten Sie, wenn Sie die benutzerdefinierte Datenkontextklasse in der gleichen Baugruppe platziert, einfach schließt die Klassennamen, z.B. CustomDataContext.

Wenn sie in verschiedenen Baugruppen sind, verwenden Sie den vollständig qualifizierten Namen, z.B. MyCo.MyApp.Data.CustomDataContext

  1. die Designer Sachen Damit funktioniert, kopieren Sie die Verbindungszeichenfolge in der Datei app.config für die Klassenbibliothek. Dies wird nicht auseinander von in der IDE verwendet werden.

Das ist es.

Sie müssen Ihre Verbindungszeichenfolge nennen die gleichen

Was Sie im Wesentlichen tun, um die Datenkontext zwingt die Verbindungsinformationen in der DBML Datei gesetzt zu ignorieren. die Konfigurationsmanager Methoden bedeutet, dass es die Verbindungszeichenfolge von der anrufenden Anordnung abholen.

HTH

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top