2017-08-08 1 views
0

Ich habe benutzerdefinierte DbContext, die von IdentityDbContext erbt. Klasse sieht wie folgt aus:Erstellen von DbContext mit Unity fehlgeschlagen mit zusätzlichen ctr

public class ReaderContext : IdentityDbContext<IdentityUser> 
{ 
    //DbSets 

    public ReaderContext() 
     : base("name=ReaderDb") 
    { 
     System.Data.Entity.Database.SetInitializer<ReaderContext>(null); 
     Database.Initialize(true); 
    } 
} 

Und wenn DbContext wie folgt aussieht, Code Erstellen von Repository (die ReaderContext verwendet) funktioniert: (! Nicht vorhandene zu entfernen)

container.RegisterType<IRepository, CustomRepository>(new HierarchicalLifetimeManager()); 
var repo = container.Resolve<IRepository>(); 

Wenn ich einen anderen Konstruktor hinzufügen In ReaderContext funktioniert das Erstellen von CustomRepository nicht mehr in UnityContainer.

Ich muss es auf diese Weise haben, damit ich Kontext mit Aufwand moq kann. Ich verwende den Unity-Container. Ausnahme Ich habe:

2017-08-07 19: 02: 57,9256: Ausnahme: Microsoft.Practices.Unity.ResolutionFailedException: Auflösung der Abhängigkeit fehlgeschlagen ist, type = „DataAccess.Database.Repositores .IRepository ", name = " (keine) ". Ausnahme aufgetreten während: während der Auflösung. Ausnahme ist: InvalidOperationException - Der aktuelle Typ System.Data.Common.DbConnection ist eine abstrakte Klasse und kann nicht konstruiert werden. Vermissen Sie ein Typ-Mapping? ----------------------------------------------- Bei der Zeit der Ausnahme, war der Behälter:

Resolving DataAccess.Database.Repositores.CustomRepository, (none) (gemappt von DataAccess.Database.Repositores.IRepository, (none))
Auflösen Parameter "Kontext" der Konstruktor DataAccess.Database.Repositores.CustomRepository (DataAccess.Database.ReaderContext context) Resolving DataAccess.Database.ReaderContext, (none) Auflösen Parameter "Verbindung" des Konstruktors DataAccess.Database.ReaderContext (System.Data.Common. DbConnection Verbindung) Resolving System.Data.Common.DbConnection, (keine) ---> System.InvalidOperationException: Der aktuelle Typ, System.Data.Common.DbConnection, ist eine abstrakte Klasse und kann nicht konstruiert werden. Vermissen Sie ein Typ-Mapping?

Warum das Hinzufügen neuer Konstruktoren die Einheitskonfiguration unterbrechen? Außerdem habe ich versucht, die Einheit von Grund auf neu zu gestalten, aber ich konnte es nicht funktionieren lassen. Wahrscheinlich weiß ich nicht, wie Einheit funktioniert, also sind alle Tipps willkommen :)

Antwort

1

Standardmäßig wählt Unity den Konstruktor mit der größten Anzahl von Parametern. Also wurde zunächst der parameterlose Konstruktor verwendet und alles war in Ordnung.

Wenn Sie jedoch den Konstruktor ReaderContext(DbConnection connection) hinzugefügt haben, war dieser Konstruktor jetzt der Konstruktor mit der größten Anzahl von Argumenten, also entschied sich Unity dafür, ihn zu verwenden. Für diesen Konstruktor benötigte Unity , aber wie die Ausnahmebedingungsanzeige angibt, ist DbConnection abstrakt, so dass Unity es nicht instanziieren konnte und es keine Typzuordnung von der abstrakten DbConnection zu einer konkreten nicht abstrakten Klasse gab, die Unity instanziieren konnte.

Die Lösung besteht darin, Unity explizit mitzuteilen, was Sie tun möchten.Wenn Sie den paramterless Konstruktor verwenden möchten würden Sie es tun, indem sie ein InjectionConstructor ohne Argumente Bereitstellung:

container.RegisterType<ReaderContext>(new InjectionConstructor()); 

Wenn Sie den DbConnection Konstruktor verwenden wollte würden Sie müssen entweder explizit Unity konfigurieren, wie ein ReaderContext zu konstruieren oder Konfigurieren Sie Unity mit dem Auflösen der Zusammenfassung DbConnection. Ich würde normalerweise den letzteren Ansatz verwenden und die Zuordnungen konfigurieren und Unity das Objekt-Diagramm erstellen lassen:

+0

Schade, ich kann nicht mehr, große Antwort. "Standardmäßig wählt Unity den Konstruktor mit der größten Anzahl an Parametern aus." Danke vielmals –

Verwandte Themen