我正在尝试将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,有时候可能会很有挑战性。如果可能的话,我非常感谢您考虑周全,并举了一些例子,因为我会把它拿来做未来的开发。
答案 0 :(得分:0)
让我们看看错误消息
无法解析构造函数'Void .ctor(Api.Layer.Object,System.Data.IDbConnection,AutoMapper.IMapper)'的参数'Api.Layer.Object context'。
意味着 Autofac 无法解析类型为context
的名为Api.Layer.Object
的参数。需要此参数来调用具有3个类型为Api.Layer.Object
,IDbConnection
和IMapper
的参数的构造函数。
当 Autofac 尝试调用此构造函数时,它将查找所有已注册的组件,以查看与Api.Layer.Object
匹配的组件。当您执行builder.RegisterType<ValuationsContext>().InstancePerLifetimeScope();
时,您仅将ValuationsContext
注册为自己。 Autofac不知道ValuationsContext
是Api.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>()));