Autofac无法解析DbContext

时间:2016-04-28 22:13:32

标签: c# autofac

我收到来自Autofac的错误消息;

可以使用可用的服务和参数调用“MyService`1 [MyContext]”类型中的'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数: 无法解析构造函数'Void .ctor(MyContext)'的参数'MyContext context'。

此代码行发生错误(也在下面的代码中显示):

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

我有兴趣注意,当我在注册中包含这一行时,一切正常:

builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());

当我注册AnyConcreteType时,这一切都有效......这让我相信我并没有注册一些东西。我的问题是我没有注册什么?出现错误消息,将MyContext命名为罪魁祸首,但显然我正在注册,如下所示 我真的不想使用AnyConcreteType ... catch all,因为我想表达只注册我需要的类。

我的服务是这样构建的:

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

3 个答案:

答案 0 :(得分:3)

Autofac and ASP .Net MVC 4 Web API

以上帖子是相关的。它没有回答这个问题,但它帮助我开始了正确的方向排除故障。解决方案在这里:

我删除了这两行:

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

并将其替换为:

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

答案 1 :(得分:0)

这对我有用

  

builder.RegisterType()为()InstancePerLifetimeScope();

答案 2 :(得分:0)

使用builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();完成了这项工作。

上下文:

我有一个DBContext类,我有注入上下文的服务,然后有控制器来调用服务(接口)。

然后在global.asax上称为builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();。自从我再次与MVC项目合作以来,这一直很有效。

如果有人对此有疑问,可以再次参考。