EntityFrameworkコア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アプリケーションの実行中に表示される場合、通常、HTTP要求ごとに登録されたコンポーネントがSingleInstance()メソッドによって要求されていることを示します。

この時点で新しい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;
    }


}

オートファックモジュール

 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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ