2017-06-16 12 views
1

私はMVCコアに簡単なブログのWebサイトを構築しようとしています。Simple Injectorを使用してカスタムモデルバインダープロバイダにクラスを挿入する方法は?

現在、私は次のようになりますAAカスタムモデルバインダープロバイダーを持っている(IBlogRepositoryはNHibernateはを使用して、私のデータベースリポジトリどこにある):

public class PostModelBinderProvider : IModelBinderProvider 
{ 
    IBlogRepository _blogRepository; 
    public PostModelBinderProvider(IBlogRepository blogRepository) 
    { 
     _blogRepository = blogRepository; 
    } 


    public IModelBinder GetBinder(ModelBinderProviderContext context) 
    { 
     //code 
    } 
} 

そして、それは次のように登録されている:

services.AddMvc(config => config.ModelBinderProviders.Insert(0, new PostModelBinderProvider(container.GetInstance<IBlogRepository>()))); 

しかし、アプリケーションを実行しようとするとこの例外が発生します。 SimpleInjector.ActivationException: 'The ISession is registered as 'Async Scoped' lifestyle, but the instance is requested outside the context of an active (Async Scoped) scope.'

現在、私のフロントエンドは、ブログ投稿データ(タイトル、コンテンツ、タグ)をサーバーに送信するajax呼び出しを行います。タグは、データベース内の一意のIDに対応する整数で表されます。モデルのバインダーは、タグのデータベースを参照してからポストを保存しています。

私はオンラインの表情をしており、モデルのバインダーでデータベースに触れるべきかどうかという意見が分かれているようです。

質問:

  • だから、それはモデルバインダーでデータベースからデータを取得しても大丈夫だと仮定して、どのように私はそれをシンプルインジェクタの仕事を作るのですか?

  • また、モデルバインダーのデータベースからデータを取得するのに問題がない場合は、ここでロジックを入れますか?

答えて

0

PostModelBinderProviderは実質的にシングルトンであり、IBlogRepositoryは一時的またはスコープです。最も簡単な解決策ではなく、Func <IBlogRepository>にIBlogRepository依存関係を変更し、次の設定を変更することです:

services.AddMvc(config => config.ModelBinderProviders.Insert(0, 
    new PostModelBinderProvider(
      container.GetInstance<IBlogRepository>))); 

PostModelBinderProviderの中にあなたが今リポジトリを取得するために、デリゲートを呼び出すことができます。

+0

ブリリアント、それはトリックでした!ありがとうございました! – nightflames

関連する問題