4

大多數在線示例處理asp.net並將它們的DbContext註冊爲其啓動服務註冊表的一部分。如何在存儲庫中注入EntityFramework核心DbContext

我試着註冊我的DbContext這樣

builder.RegisterType<MyContext>() 
    .As<MyContext>() 
    .InstancePerLifetimeScope(); 

builder.RegisterType<DealRepository>() 
    .Keyed<IRepository<Deal>>(FiberModule.Key_DoNotSerialize) 
    .As<IRepository<Deal>>() 
    .SingleInstance(); 

builder.RegisterType<CardsDialog>() 
    .As<IDialog<object>>() 
    .InstancePerDependency(); 

但我發現了這個錯誤的類型違反

繼承安全規則: 'System.Net.Http.WebRequestHandler'。派生類型必須匹配 基類型的安全可訪問性或不易訪問。

它更復雜,因爲實際MessageController.cs創建於Post

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity)) 
{ 
    var dialog = scope.Resolve<IDialog<object>>(); 

    await Conversation.SendAsync(activity,() => dialog); 

} 

一個新的範圍應如何登記辦?

編輯: 如建議,使用InstancePerRequest解決了這個問題。但是我也有一個Quartz作業,每X秒運行一次,也需要一個存儲庫。

builder.RegisterType<DealJob>() 
    .AsSelf() 
    .SingleInstance(); 

無法解析類型「BargainBot.Repositories.MyContext」,因爲 它屬於在壽命範圍不能被定位。以下 服務由該登記暴露: - BargainBot.Repositories.MyContext

細節--->沒有與標籤匹配的「AutofacWebRequest」範圍 從其中要求實例的範圍可見。如果你的web應用程序的執行過程中看到這一點,它通常表示正被SingleInstance要求註冊爲每個HTTP請求的組件()

我應該在這一點上手動解決一個新的DbContext?或者,也許我應該改變我的回購的生命週期?

Edit2:看起來我仍然得到這個錯誤,即使在刪除整個Quartz作業註冊。

+0

你試試將您的上下文註冊爲builder.RegisterType ().InstancePerRequest(); –

+0

你爲什麼不把你的DbContext添加到'Startup.cs'中的'ConfigureServices'方法?類似於'services.AddDbContext (options => options.UseSqlServer(Configuration.GetConnectionString(「DefaultConnection」)));'然後添加你的Repository:'services.AddScoped ();' – kimbaudi

+0

沒有'Startup.cs'因爲我不在asp.net上下文中。這是在MicrosoftBot框架應用程序中。我會在原始問題中澄清。 – martinni39

回答

1

我錯了,這不是IoC和DbContext問題。好像它是在.NET平臺本身

https://github.com/dotnet/corefx/issues/9846#issuecomment-274707732

添加重定向的伎倆

<dependentAssembly> 
    <assemblyIdentity name="System.ComponentModel.TypeConverter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.0.0" /> 
    </dependentAssembly> 
0

安裝System.Net.Http 4.3.1解決我的問題