使用Autofac解析参数“ Api.Layer.ContextObject上下文”

时间:2018-12-14 14:52:50

标签: c# dependency-injection inversion-of-control autofac

我正在尝试将Autofac实施到最初使用Microsoft的Dipenedency注入的工作中。

我可以使用Autofac成功注册我的存储库,董事等,但是,当涉及将用于数据库的上下文时,我会不断遇到错误:

  

无法解析构造函数的参数“ Api.Layer.Object上下文”   'Void .ctor(Api.Layer.Object,System.Data.IDbConnection,   AutoMapper.IMapper)”。

最初,我使用Microsoft的方式使用以下代码将ContextObject注册到服务:

services.AddDbContext<MyContext>(
                                options => options.UseSqlServer(loggingConnection.Value,
                                c => c.MigrationsAssembly("ApiName")));

当尝试使用Autofac时,我尝试根据研究使用以下内容:

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

我仍然对Autofac还是陌生的,因此我想尝试解决这个问题,而作为Junior,有时候可能会很有挑战性。如果可能的话,我非常感谢您考虑周全,并举了一些例子,因为我会把它拿来做未来的开发。

1 个答案:

答案 0 :(得分:0)

让我们看看错误消息

  

无法解析构造函数'Void .ctor(Api.Layer.Object,System.Data.IDbConnection,AutoMapper.IMapper)'的参数'Api.Layer.Object context'。

意味着 Autofac 无法解析类型为context的名为Api.Layer.Object的参数。需要此参数来调用具有3个类型为Api.Layer.ObjectIDbConnectionIMapper的参数的构造函数。

Autofac 尝试调用此构造函数时,它将查找所有已注册的组件,以查看与Api.Layer.Object匹配的组件。当您执行builder.RegisterType<ValuationsContext>().InstancePerLifetimeScope();时,您仅将ValuationsContext注册为自己。 Autofac不知道ValuationsContextApi.Layer.Object。要使其正常工作,您可以将其指定为 Autofac

builder.RegisterType<ValuationsContext>()
       .As<Api.Layer.Object>()
       .InstancePerLifetimeScope();

但是基于类的名称(Object),该对象看起来非常通用,并注册该对象,因为它的基本类型可能不是最佳解决方案。也许您可以通过依赖ValuationsContext来尝试使用更具体的构造函数,或者通过引入IValuationsContext甚至更好?

另一种解决方案是使用WithParameter方法

builder.RegisterType<ValuationsContext>().InstancePerLifetimeScope();
builder.RegisterType<MyContext>()
       .As<...>() 
       .WithParameter(
         new ResolvedParameter(
           (pi, ctx) => pi.ParameterType == typeof(Api.Layer.Object) && pi.Name == "context",
           (pi, ctx) => ctx.Resolve<ValuationsContext>()));