Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac无法解析DbContext_C#_Autofac - Fatal编程技术网

C# Autofac无法解析DbContext

C# Autofac无法解析DbContext,c#,autofac,C#,Autofac,我从Autofac收到此错误消息;: 在类型“MyService`1[MyContext]”上使用“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找到的构造函数都不能使用可用的服务和参数调用: 无法解析构造函数“Void.ctor(MyContext)”的参数“MyContext context” 错误发生在这一行代码上(也显示在下面的代码中): 事实上,当我注册任何具体类型时,它都能工作。。。让我相信我没有注册什么东西。

我从Autofac收到此错误消息;:

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

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

事实上,当我注册任何具体类型时,它都能工作。。。让我相信我没有注册什么东西。我的问题是我没有注册什么?错误消息似乎将MyContext命名为罪魁祸首,但很明显,我正在注册它,如下所示。
我真的不想用AnyConcreteType。。。因为我只想明确地注册我所需要的类

我的服务结构如下:

public class MyService<T> : BaseService<T>, IMyService where T:DbContext,IMyContext
{
    public MyService(T context) : base(context)
    {
    }
}
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??
builder.RegisterType().As();
builder.RegisterType().As().SingleInstance();
builder.RegisterType();
builder.RegisterType();//这有必要吗??
我这样称呼它:

    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>();
    namedConnectionString.ConnectionString = myConnectionString;
    IMyService myService = container.Resolve<IMyService>();  // error here
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
INamedConnectionString namedConnectionString=container.Resolve();
namedConnectionString.ConnectionString=myConnectionString;
IMyService myService=container.Resolve();//这里出错

上述线程是相关的。它没有回答这个问题,但它帮助我开始朝着正确的方向进行故障排除。解决方案如下:

我删除了这两行:

builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
builder.RegisterType();
builder.RegisterType();//这有必要吗??
并将其替换为以下内容:

builder.RegisterType<MyContext>().InstancePerLifetimeScope();
builder.RegisterType();
这对我很有效

builder.RegisterType()


通过使用
builder.RegisterType().InstancePerLifetimeScope()实现此功能

背景:

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

然后在global.asax上调用
builder.RegisterType().InstancePerLifetimeScope()。这很有效,自从我再次参与MVC项目以来已经有一段时间了

如果有人对此有问题,您可以再次参考

    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    INamedConnectionString namedConnectionString = container.Resolve<INamedConnectionString>();
    namedConnectionString.ConnectionString = myConnectionString;
    IMyService myService = container.Resolve<IMyService>();  // error here
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
builder.RegisterType<MyContext>().InstancePerLifetimeScope();