2016-06-27 12 views
0

Ich habe einen Konstruktor für meine Klasse, der einfach ein Konfigurationsobjekt verwendet, das die Standardverbindungszeichenfolge für mein Projekt zurückgibt.Verwenden der Abhängigkeitsinjektion mit einem erforderlichen Standardkonstruktor

Entity-Framework beschwert sich, wenn ich versuche, meine Datenbank zu aktualisieren, da es einen Standardkonstruktor (keine Parameter) erfordert.

Ich verwende Strukturkarte und meine Konfiguration Code sieht wie folgt aus:

public class GAPDLRegistry : Registry 
{ 
    public GAPDLRegistry() 
    { 
     For<IAllMidContext>().Use<AllMidContext>(); 
     For<IDataContextAccess>().Use<DataContextAccess>(); 
     For<IConfigurationAccess>().Use<ConfigurationAccess>(); 

     For<ITournamentRepository>().Use<TournamentRepository>(); 
    } 
} 

Ich kann nicht denken Sie an einen Weg, um einen Standard-Konstruktor haben, während immer noch meine Abhängigkeiten zu injizieren.

+0

Bitte legen Sie eine [Minimal, Complete, und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve). Bitte lesen Sie auch [Wie stelle ich eine gute Frage] (http://stackoverflow.com/help/how-to-ask). Stellen Sie sicher, dass Ihre Fragen spezifisch und nicht zu weit gefasst sind. Bitte geben Sie in diesem Fall an, welches DI-Framework Sie verwenden und Ihren Konfigurationscode für das DI-Framework. – Igor

+0

Wie beschwört sich Entity Framework? Hast du eine Ausnahme? –

Antwort

0

fügen diese Quelle, um Ihren Code

public AllMidContext() : base(ConfigAccess.GetDefaultConnectionString()) 
{} 

[Inject] 
public IConfigurationAccess ConfigAccess 
{ 
    get; 
    set; 
} 
0

Sie DI eigentlich nicht brauchen dafür.

EntityFramework verwendet eine Instanz von IDbConnectionFactory, um das Laden der Verbindungszeichenfolge aus der Konfigurationsdatei zu ermöglichen. Also, in der Anwendungskonfigurationsdatei sollten Sie ein Element wie diese:

<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> 
    <parameters> 
     <parameter value="mssqllocaldb" /> 
    </parameters> 
</defaultConnectionFactory> 

Wenn Ihre Datenbank eine SQL Server-Datenbank ist nur einen Blick auf SqlConnectionFactory und verwendet, die in der Konfigurationsdatei.

Ansonsten können Sie eine eigene Klasse erstellen und als Verbindungsfactory verwenden:

public class CustomConnectionFactory : IDbConnectionFactory 
{ 
    public CustomConnectionFactory(string connectionStringName) 
    { 
     _connectionStringName = connectionStringName; 
    } 

    public DbConnection CreateConnection(string nameOrConnectionString) 
    { 
     var connectionString = ConfigurationManager.ConnectionStrings[_connectionStringName].ConnectionString; 
     return new SqlConnection(connectionString); 
    } 
} 

Und Sie können, dass in der Konfigurationsdatei verwenden:

<connectionStrings> 
    <add name="ApplicationDB" connectionString="..." /> 
</connectionStrings> 

<defaultConnectionFactory type="Your.Class.Namespace.CustomConnectionFactory, YourAssemblyName"> 
    <parameters> 
     <parameter value="ApplicationDb" /> 
    </parameters> 
</defaultConnectionFactory> 
Verwandte Themen