簡體   English   中英

Autofac 無法解析 DbContext

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM