2017-10-25 4 views
3

Ich kann das einfach nicht herausfinden. Verwenden von Autofac mit .Net Core 2.0 und versuchen, einige einfache Abhängigkeiten aufzulösen. Fühle mich wie ich alles versucht habe, so dass mein aktueller Code nicht alles wiedergibt, was ich versucht habe.Autofac DI, Typ nicht zuweisbar Service

Dies ist eine der Ausnahmen ich von Autofac bekommen

Keiner der Konstrukteure mit ‚Autofac.Core.Activators.Reflection.DefaultConstructorFinder‘ vom Typ gefunden ‚Elucidate.Core.Application.ValuesController 'kann mit den verfügbaren Diensten und Parametern aufgerufen werden: Der Parameter' Elucidate.Core.Data.Repository.IRepository'1 [Elucidate.Core.Model.User.IUser] rep 'des Konstruktors' Void .ctor (Elucidate.Core. Data.Repository.IRepository`

Hier ist, wo ich versuche, die Depe zu bekommen ndency injiziert

public ValuesController(IRepository<IUser> rep) 

Hier ist, wie ich die Typen in einem Autofac Modul Registrierung

builder.RegisterType<User>().As<IUser>(); 
builder.RegisterType<CoreUserStore<User>>(); 

builder.RegisterType(typeof(Repository<User>)).As<Repository<IUser>>(); 
builder.RegisterType<EntityFrameworkModelContext<User>>(); //.As<IModelContext>(); 

Was mache ich falsch? Ich bin neu in Autofac, an Unity gewöhnt, die ausgestorben zu sein scheint.

Antwort

3

Der ValuesController Konstruktor erwartet IRepository<IUser> und Sie haben nicht den richtigen Typ in Autofac verdrahtet.

Sie müssen die konkreten Repositorytyp als die implementierte Schnittstelle registrieren, beachten Sie die .As<IRepository...:

builder.RegisterType(typeof(Repository<User>)).As<IRepository<IUser>>(); 

Oder alternativ „fragen“ für den konkreten Typ im Konstruktor.

public ValuesController(Repository<IUser> rep) 

Die erste ist wahrscheinlich der bevorzugte Ansatz. Sie können auch tun:

builder.RegisterType<Repository<User>>().AsImplementedInterfaces(); 

Welche den konkreten Typ als alle implementierten Schnittstellen registrieren wird.

+0

Vielen Dank! Ich habe das versucht, aber immer noch eine Ausnahme, die ich nicht ganz bekommen kann. Ist die Notation in doppelten Klammern überhaupt beunruhigend? Beide dieser konkreten Typen implementieren diese Schnittstelle definitiv. ArgumentException: Der Typ 'Elucidate.Core.Data.Repository.Repository'1 [Elucidate.Core.Model.User.User]' ist dem Dienst nicht zuweisbar 'Elucidate.Core.Data.Repository.IRepository'1 [ [Elucidate.Core.Model.User.IUser, Elucidate.Core.Model, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] '. –

+0

@ JimPhelan, mit was Sie jetzt beschäftigen, ist ein anderes Problem; Kovarianz. 'Repository ' kann nicht der Schnittstelle 'IRepository ' zugewiesen werden, versuchen Sie es in Code ohne Autofac, es wird Ihnen einen Compilerfehler geben. Ich würde vorschlagen, dass Sie "IUser" nicht verwenden und nur Repositories um konkrete Typen registrieren. Sonst können Sie hier ausprobieren, wie man Kovarianz verwendet: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-generic-modifier – Xenolightning

+0

Danke @xenolightning Ich habe Es sortiert nach dem Redesign der Schnittstellen ein bisschen. Ich hätte es ohne Autofac ausprobiert, wie du es zuerst beschrieben hast, es war ziemlich offensichtlich, als ich es getan habe. Danke noch einmal. –

Verwandte Themen