如何在Repository中註入EntityFramework Core DbContext

autofac botframework c# entity-framework entity-framework-core

大多數在線示例處理asp.net並將其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.csPost上創建了一個新的範圍

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作業註冊,我仍然會收到此錯誤。

一般承認的答案

我對這個問題錯了,它不是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>

熱門答案

我遇到了類似的問題,經過大量的來回後,以下代碼對我有用:

的DbContext

 public class SalesDbContext : DbContext
{
    public SalesDbContext(DbContextOptions<SalesDbContext> options) : base(options)
    {
    }

    public DbSet<Domain.Product.Product> Products { get; set; }


    protected override void OnModelCreating(ModelBuilder builder)
    {
        // Configure database attributes
    }



}

知識庫

 public class ProductRepository : IProductRepository
{
    private readonly SalesDbContext _db;

    public ProductRepository(SalesDbContext db)
    {
        _db = db;
    }


}

Autofac模塊

 public class DefaultModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        // Register Entity Framework
        var dbContextOptionsBuilder = new DbContextOptionsBuilder<SalesDbContext>().UseSqlServer("MyConnectionString");

        builder.RegisterType<SalesDbContext>()
            .WithParameter("options", dbContextOptionsBuilder.Options)
            .InstancePerLifetimeScope(); 

    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow