[英]Autofac cannot resolve DbContext
我從 Autofac 收到此錯誤消息;:
在類型 'MyService`1[MyContext]' 上找到的帶有 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 的構造函數都不能用可用的服務和參數調用:無法解析構造函數 'Void .ctor 的參數 'MyContext context' (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
Autofac 和 ASP .Net MVC 4 Web API
上面的線程是相關的。 它沒有回答問題,但它幫助我開始朝着正確的方向進行故障排除。 解決方案在這里:
我刪除了這兩行:
builder.RegisterType<MyContext>().As<IMyContext>().InstancePerLifetimeScope();
builder.RegisterType<DbContext>(); // is this necessary??
並用這個替換它們:
builder.RegisterType<MyContext>().InstancePerLifetimeScope();
這對我有用
builder.RegisterType().As().InstancePerLifetimeScope();
通過使用builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();
得到這個工作 .
背景:
我有一個 DBContext 類,我有注入上下文的服務,然后有控制器來調用服務(接口)。
然后在 global.asax 上,調用了builder.RegisterType<InventoryContext>().InstancePerLifetimeScope();
. 這很有效,自從我再次使用 MVC 項目以來已經有一段時間了。
如果有人對此有疑問,您可以再次參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.