2017-08-29 8 views
0

私は2.次のクラスを考えてみましょうAsp.netコアを使用しています:contextLifetimeをSingletonに変更するのは、次のエラーを修正する正しい解決策ですか?

public class BlogDbContext: DbContext 
{ 
..... 
} 

public interface IBlogData { ... } 

public class BlogData : IBlogData 
{ 
    private BlogDbContext _context; 
    public BlogData(BlogDbContext context) { ... } 
    ....... 
} 

次のように私は、デフォルト値contextLifetime: ServiceLifetime.Scopedを使用し、

public void ConfigureServices(IServiceCollection services) 
{ 

    ..... 

    services.AddDbContext<BlogDbContext>(...); 

    ..... 

    services.AddSingleton<IBlogData, BlogData>(); 
} 

コンパイル、最初の移行と最初のデータベースの更新が行われましたエラーなし。しかし、私は最初にページを訪問するときに次のエラーが発生します。シングルトン 'MyProject.Services.IBlogData' からスコープのサービスを消費することはできません 'MyProject.Data.BlogDbContext':

InvalidOperationExceptionが。私は次のようにcontextLifetimeを変更することでエラーを修正する場合

質問

は、それが正しいですか?

public void ConfigureServices(IServiceCollection services) 
{ 

    ..... 

    services.AddDbContext<BlogDbContext>(...,contextLifetime: ServiceLifetime.Singleton); 

    ..... 

    services.AddSingleton<IBlogData, BlogData>(); 
} 

注:この問題は、Asp.Net Core 2.0に固有です。

+1

あなたの 'IBlogData'に' AddScoped'を使うのが良い解決策だと思います。 –

答えて

1

いいえ、asp.netコアのDbContextにscopedを使用するのが一般的です。リクエストごとに一度作成され、リクエストの最後に自動的に処理されます。

あなたは本当にエラーが起こっているのコードを示していないが、あなたはマイグレーションを実行するために、起動中にいくつかのコードを実行しているので、私の推測では、それが起こっていますさ。実際にエラーが発生しているコードを確認したり表示したりすると、私はもっと助けてもらえます。

+0

私はプロジェクトをコンパイルし、最初の移行とデータベースの更新を行います。すべてがうまく動作します。しかし、私がページを訪問するとき、私は上記のエラーを持っています。 –

+0

あなたの質問は、エラーが発生した場所のコードを表示する必要があります。他のサービスクラスの内部でdbcontextを使用している場合、そのクラスも有効範囲にする必要があります –

1

シングルトンサービスのスコープ付きサービスを使用しようとしているからです。 これはasp.netコア2.0の新機能です。シグネチャサービス でシングルトンサービスのみを使用できます。 BlogDataをScopedとして追加する必要があります。

関連する問題