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