Я получаю сообщение об ошибке от Autofac ;:Autofac не может разрешить DbContext
Ни один из конструкторов, найденных с «Autofac.Core.Activators.Reflection.DefaultConstructorFinder» по типу "MyService`1 [MyContext] не может быть вызывается с доступными службами и параметрами: Не удается разрешить параметр «Контекст MyContext» конструктора «Void .ctor (MyContext)».
Ошибка возникает на этой строке кода (также показаны в коде ниже):
IMyService myService = container.Resolve<IMyService>(); // error here
Мне интересно отметить, что, когда я включаю эту линию в моих регистраций, все работает:
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
Тот факт, что все это работает, когда я регистрирую AnyConcreteType ... заставляет меня поверить, что я ничего не регистрирую. Мой вопрос в том, что я не регистрирую? Сообщение об ошибке отображается как MyContext как преступник, но я четко регистрирую его, как показано ниже.
Я действительно не хочу использовать AnyConcreteType ... улавливать все, потому что я хочу, чтобы я просто объяснял только те классы, которые мне нужны.
Моя служба строится так:
public class MyService<T> : BaseService<T>, IMyService where T:DbContext,IMyContext
{
public MyService(T context) : base(context)
{
}
}
MyService происходит от BaseService:
public abstract class BaseService<T> : IDisposable where T:DbContext, IMyContext
{
internal T db;
public BaseService(T context)
{
db = context;
}
}
MyContext передается MyService и строится так:
public partial class MyContext : DbContext, IMyContext
{
public MyContext(INamedConnectionString conn)
: base(conn.ConnectionString)
{
Configuration.ProxyCreationEnabled = false;
}
}
Вот NamedConnectionString
public class NamedConnectionString : INamedConnectionString
{
public string ConnectionString { get; set; }
}
Вот как зарегистрировать выше:
builder.RegisterType<MyService<MyContext>>().As<IMyService>();
builder.RegisterType<NamedConnectionString>().As<INamedConnectionString>().SingleInstance();
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
А вот как я это называю:
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>();
namedConnectionString.ConnectionString = myConnectionString;
IMyService myService = container.Resolve<IMyService>(); // error here