2016-04-28 2 views
1

Я получаю сообщение об ошибке от 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 

ответ

2

Autofac and ASP .Net MVC 4 Web API

выше нить связана. Он не отвечает на вопрос, но это помогло мне начать поиск и устранение неисправностей в правильном направлении. Решение здесь:

Я удалил эти две строки:

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

и заменил их с этим:

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

Это работал для меня

builder.RegisterType (.) .Как() InstancePerLifetimeScope();

Смежные вопросы