0

Entschuldigung, wenn das verwirrend ist, mein Kopf ist gebraten, versucht, eine Lösung zu finden, so dass meine Erklärung schrecklich sein kann. Einfach nur in die richtige Richtung zu zeigen wäre von Vorteil, und ich werde es nach Bedarf klären. Wahrscheinlich ist das nur mein mangelndes Verständnis. Danke im Voraus!Ist es möglich, im DbContext-Konstruktor eine Verbindungszeichenfolge zu fordern, die von DI (startup.cs) ohne IDbContextFactory konfiguriert wurde?

Ich habe einen DBContext (EF6) in einer eigenständigen Bibliothek, die ich zwischen zwei Anwendungen ... eine ASP.Net Core 1.x-Website und eine Azure-Webfunktion (mit azur Kernfunktionen) teilen. Natürlich verwenden diese unterschiedliche Einstellungsdateien, aber das ist insgesamt ein anderes Problem. Ich will keine „hard-coded“ Verbindungszeichenfolgen verwenden, so dass ich versuchte, die DI einzurichten, um die appsettings.json Verbindungszeichenfolge zu verwenden:

var connectionString = connectionStrings.Data.App1.ConnectionString; 
services.AddScoped<AppDbContext>(_ => new AppDbContext(connectionString)); 

Ich bin auch ein allgemeines Repository, die ich habe einrichten als:

services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); 

Das Repository arbeitet mit einer bestimmten Entität im DBSet. Ein Service wird dann für jede Ressource verwendet. Die Implementierung jedes Dienstes (der in einer MVC-Seite oder von einem API-Endpunkt verwendet werden kann) greift auf das Repository zu. Zum Beispiel ist der Konstruktor für den Konfigurationsdienst ..

public AppConfigurationService(IRepository<AppConfiguration> repo) 

als

registriert
services.AddScoped<IService<AppConfiguration>, AppConfigurationService>(); 

Der Konstruktor des Repository akzeptiert eine Instanz von „AppDbContext“, dass ich dachte, dass über die Verbindungszeichenfolge verwenden.

public Repository(AppDbContext context) 

Während des Debugging habe ich festgestellt, dass die Verbindungszeichenfolge nicht immer festgelegt ist. Wenn AppConfigureServices ausgeführt wird, wird die Verbindungszeichenfolge wie erwartet übergeben. Wenn ein Controller jedoch einen Dienst instanziiert, ist die Verbindungszeichenfolge immer leer, daher wird der standardmäßige DBContext-Konstruktor aufgerufen.

Meine Konstruktor der Heimsteuerung als

public HomeController(IService<AppConfiguration> service) 

gesetzt Wenn ich versuche, den Repo-Dienst zugreifen von jedem der Aktionen des Controller, eine DbContext ohne die Verbindungszeichenfolge newed auf.

Ist es möglich, die Verbindungszeichenfolge in startup.cs so festzulegen? Könnte meine Verwendung von generischen Basisklassen DI zunichte machen? Wenn ich IDbContextFactory verwende, gibt es eine Möglichkeit festzustellen, ob eine Verbindungszeichenfolge für den DbContext verfügbar ist, bevor ich zu den Konfigurationsdateien gehe?

Nochmals vielen Dank für Anregungen/Richtungsweisend.

aktualisieren

Betrachten Sie erbt die AppConfigurationService von BaseService, die wie folgt definiert ist:

public class AppConfigurationService : BaseService<AppConfiguration> 
... 
public abstract class BaseService<TEntity>: IService<TEntity> where TEntity : class, IEntityId<Guid> 

Dienstleistungen, die von der BaseService nicht, zB erben:

public class ConnectionService: IService<Connection>, IServiceClone<Connection> 

Sind neu mit einer Verbindungszeichenfolge.Daher haben nur die Services, die von BaseService erben, keine Verbindungszeichenfolge mit dem DBContext.

Antwort

0

Vielleicht können Sie versuchen, Ihre Verbindungszeichenfolge als Singleton einzurichten, da Sie zwei getrennte Anwendungen haben, die sich dasselbe Repository teilen.

Etwas wie folgt aus:

interface IConnectionProvider { string GetConnectionString(); } 
public class ConnectionProvider : IConnectionProvider { public string GetConnectionString() { return connectionStrings.Data.App1.ConnectionString; } } 

services.AddSingleton<IConnectionProvider, ConnectionProvider>(); 

Dann ändern Sie DbContext die Verbindung Provider erhalten:

public AppDbContext(IConnectionProvider provider) : base(provider.GetConnectionString()) 

Hoffnung, dass es hilft.

+0

Vielen Dank! Ich werde es mit IOptions versuchen und Ihnen die Ergebnisse mitteilen. – ACG

+0

Keine echte Änderung mit IOptions, einige Anrufe haben immer noch keine Verbindungszeichenfolge, während die meisten tun. Der Stack-Trace des fehlerhaften und funktionierenden Codes hat denselben Ursprung. Wenn ich noch etwas anderes finde, werde ich es euch wissen lassen. Danke, dass du dir die Zeit genommen hast. – ACG

+0

Wie Instanziieren Sie Ihren Dienst auf dem Controller, dass die Zeichenfolge Verbindung leer wird? Erhalten Sie von DI oder hart codierten Weg? –

Verwandte Themen