Benutzer mit den meisten Antworten
SQL Connection String aus appsettings lesen

Frage
-
Hallo,
in .net core 2.2 möchte ich eine WebAPI schreiben mit SQL-Datenbank Zugriff. Alles funktioniert soweit reibungslos. Will ich jedoch das Framework zum Auslesen des Connection-Strings aus der appsettings.json nutzen, ist der "connectionString" null. Setze ich ihn explizit funktioniert die DB Anbindung.
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "ConnectionStrings": { "Database": "Integrated Security=True;database=dbname;server=servername" }, "AllowedHosts": "*" }
MYModel:
public class MyModel { static string connectionString = @"Integrated Security=True;database=dbname;server=servername"; //static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionStrings:ServiceManagerDatabase"].ConnectionString; public static string test() { string output = ""; SqlConnection connection = new SqlConnection(connectionString); string queryString = @"select * from test"; SqlCommand command = new SqlCommand(queryString, connection); command.Connection.Open(); SqlDataReader dataReader = command.ExecuteReader(); while (dataReader.Read()) { output+= dataReader.GetString(0); } // Call Close when done reading. dataReader.Close(); return output; } }
Startup.cs:
public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseMvc(); } }
- Bearbeitet Zero3000 Mittwoch, 25. September 2019 09:12
Antworten
-
Alle Objekte die im Service Container enthalten sind, kann man sich über den Klassenkonstruktor übergeben lassen. Das gilt natürlich wiederum nur für Objekte die selbst vom Service Container erstellt werden. Das sind z.B. alle Controller.
Bei ASP.NET Core ist dies ja auch unproblematisch da in Startup.Configure diese Objekte zur Verfügung stehen.
Wenn ein User dann eine Anfrage an den Server stellt, wird von ASP.NET diesen an den entsprechenden Controller weitergeleitet. Im Controller selbst kann man sich über den Klassenkonstruktor alle nötigen Abhängigkeiten reingeben lassen. Braucht ein Model nun z.B. die Datenbankverbindung, übergibt man selbst die Abhängigkeiten über den Klassenkonstruktor.
Welchen Datenbank Context Du nun über den Service Container zur Verfügung stellst, bleibt ganz dir überlassen. Für DB Context die in so gut wie allen Controllern benötigt werden wie z.B. UserDB macht das sehr viel sinn.
Bei Service Containern ist es aber eigentlich so das alles was man innerhalb einer Anwendung braucht einmal zu beginn (Startup) bereitgestellt wird. Einfach dumm einer Regel zu folgen macht nach meiner Ansicht keinen Sinn außer natürlich es sprechen gute gründe dafür, wie z.B. eine Absprache im Team
Bei einer Webanwendung sind statische Objekte die nur readonly sind meinst unproblematisch. Wenn man einen Connectionstring hat der nur einmal zu start gesetzt wird, macht static sehr viel sinn.
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings- Bearbeitet Thomas Wycichowski Donnerstag, 26. September 2019 10:14
- Als Antwort markiert Zero3000 Freitag, 27. September 2019 06:41
Alle Antworten
-
Hallo,
IConfiguration muss vom Framework erstellt werden. Das erreicht man am besten in dem man im Klassenkonstruktor diesen mit dependency injection sich rein geben lässt.
Ich mache das immer einmal in Startup und lege die nötigen Wert in statischen Feldern ab
internal static string SecureKey = "la"; public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; SecureKey = Configuration["JwtKey"]; Shared.GlobalConfig.WebApiUri = Configuration["WebApiUri"]; var flyerSize = Configuration["FlyerMaxSizeInMb"]; if (string.IsNullOrWhiteSpace(flyerSize) == false) { if (int.TryParse(flyerSize, out int s)) { Shared.GlobalConfig.FlyerMaxSizeInMb = s; } } }
Du solltest für alle Klassen die IDisposable implementieren ein using nutzen. Das sind alle Klassen in den man Dispose aufrufen kann. Schau dir mal die Doku an Link
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings
- Bearbeitet Thomas Wycichowski Dienstag, 24. September 2019 21:38
- Als Antwort vorgeschlagen Christoph Biegner Mittwoch, 25. September 2019 07:15
-
Um den DB-Kontext innerhalb der Startup.cs mittels dependency injection zu laden nahm ich an es genügt:
public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }
siehe oben meine Startup.cs. die Hatte ich vergessen.
- Bearbeitet Zero3000 Mittwoch, 25. September 2019 09:13
-
Ja das genügt. Configuration ist aber nun mal in der Klasse Startup. Wenn Du auf das Objekt aus anderen Klassen zugreifen willst, müsstest Du es statisch machen.
Man sollte aber in der Webentwicklung mit statischen Objekten sehr vorsichtig sein
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings -
Wie gehe ich dann vor wenn ich es nicht statisch hinterlegen will? Baut man sich einen Controller
public MyController(IConfiguration configuration)
und übergibt den Connectionstring so an das Model.
Dann verstehe ich aber den Sinn von der ConfigurationManager Klasse nicht, da ich dachte das diese an beliebiger Stelle den Zugriff auf den Connectionstring gewährleistet. und wozu ist in der Startup die Eigenschaft Configuration auf public gesetzt?
- Bearbeitet Zero3000 Donnerstag, 26. September 2019 10:13
-
Alle Objekte die im Service Container enthalten sind, kann man sich über den Klassenkonstruktor übergeben lassen. Das gilt natürlich wiederum nur für Objekte die selbst vom Service Container erstellt werden. Das sind z.B. alle Controller.
Bei ASP.NET Core ist dies ja auch unproblematisch da in Startup.Configure diese Objekte zur Verfügung stehen.
Wenn ein User dann eine Anfrage an den Server stellt, wird von ASP.NET diesen an den entsprechenden Controller weitergeleitet. Im Controller selbst kann man sich über den Klassenkonstruktor alle nötigen Abhängigkeiten reingeben lassen. Braucht ein Model nun z.B. die Datenbankverbindung, übergibt man selbst die Abhängigkeiten über den Klassenkonstruktor.
Welchen Datenbank Context Du nun über den Service Container zur Verfügung stellst, bleibt ganz dir überlassen. Für DB Context die in so gut wie allen Controllern benötigt werden wie z.B. UserDB macht das sehr viel sinn.
Bei Service Containern ist es aber eigentlich so das alles was man innerhalb einer Anwendung braucht einmal zu beginn (Startup) bereitgestellt wird. Einfach dumm einer Regel zu folgen macht nach meiner Ansicht keinen Sinn außer natürlich es sprechen gute gründe dafür, wie z.B. eine Absprache im Team
Bei einer Webanwendung sind statische Objekte die nur readonly sind meinst unproblematisch. Wenn man einen Connectionstring hat der nur einmal zu start gesetzt wird, macht static sehr viel sinn.
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings- Bearbeitet Thomas Wycichowski Donnerstag, 26. September 2019 10:14
- Als Antwort markiert Zero3000 Freitag, 27. September 2019 06:41