2016-04-28 27 views
1

Ich erhalte diese Fehlermeldung von Autofac ;:Autofac nicht auflösen kann DbContext

Keiner der Konstrukteure mit ‚Autofac.Core.Activators.Reflection.DefaultConstructorFinder‘ vom Typ gefunden ‚MyService`1 [mycontext]‘ sein kann Aufruf mit den verfügbaren Diensten und Parametern: Der Parameter 'MyContext context' des Konstruktors 'Void .ctor (MyContext)' kann nicht aufgelöst werden.

Der Fehler tritt auf dieser Zeile Code (auch im Code unten):

IMyService myService = container.Resolve<IMyService>(); // error here 

Ich bin interessiert zu beachten, dass, wenn ich diese Zeile in meinen Registrierungen bin, alles funktioniert:

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource()); 

Die Tatsache, dass alles funktioniert, wenn ich AnyConcreteType registriere, lässt mich glauben, dass ich mich nicht registriere. Meine Frage ist, was ich nicht registriere? Die Fehlermeldung scheint MyContext als den Täter zu benennen, aber ich registriere es wie unten gezeigt.
Ich möchte wirklich nicht den AnyConcreteType verwenden ... alles abfangen, weil ich explizit nur die Klassen registrieren möchte, die ich brauche.

Mein Service wie folgt aufgebaut ist:

public class MyService<T> : BaseService<T>, IMyService where T:DbContext,IMyContext 
{ 
    public MyService(T context) : base(context) 
    { 
    } 
} 

MyService leitet sich von BaseService:

public abstract class BaseService<T> : IDisposable where T:DbContext, IMyContext 
{ 
    internal T db; 

    public BaseService(T context) 
    { 
     db = context; 
    } 
} 

mycontext zu MyService geführt und wie folgt aufgebaut:

public partial class MyContext : DbContext, IMyContext 
{ 
    public MyContext(INamedConnectionString conn) 
     : base(conn.ConnectionString) 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 

Hier NamedConnectionString

public class NamedConnectionString : INamedConnectionString 
{ 
    public string ConnectionString { get; set; } 
} 

Hier ist, wie ich das oben registrieren:

builder.RegisterType<MyService<MyContext>>().As<IMyService>(); 
builder.RegisterType<NamedConnectionString>().As<INamedConnectionString>().SingleInstance(); 
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope(); 
builder.RegisterType<DbContext>(); // is this necessary?? 

Und hier ist, wie ich es nennen:

var container = builder.Build(); 
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>(); 
    namedConnectionString.ConnectionString = myConnectionString; 
    IMyService myService = container.Resolve<IMyService>(); // error here 

Antwort

2

Autofac and ASP .Net MVC 4 Web API

Der oben genannte Thread verwendet ist. Es beantwortet die Frage nicht, aber es half mir, die Fehlersuche in die richtige Richtung zu bringen. Die Lösung ist hier:

builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope(); 
builder.RegisterType<DbContext>(); // is this necessary?? 

und ersetzte sie mit diesem einen:

ich diese beiden Zeilen entfernt

builder.RegisterType<MyContext>().InstancePerLifetimeScope(); 
0

Dieser arbeitete für mich

builder.RegisterType () .As(). InstancePerLifetimeScope();

Verwandte Themen