1

データベースの情報をチェックするカスタムルート制約を実装しようとしています。私は経路の制約を働かせていますが、クラスターにDbContextを挿入してデータベースを操作しようとすると、パラメーターのないコンストラクターの問題が発生しています。ここに私のコードは次のとおりです。.Net Coreの依存関係注入を使用したカスタムルート制約

マイカスタムルート制約:

public class DynamicPageRouteConstraint : IRouteConstraint 
    { 
     public const string ROUTE_LABEL = "dbDynamicRoute"; 
     private ApplicationDbContext db; 

     public DynamicPageRouteConstraint(ApplicationDbContext _db) 
     { 
      db = _db; 
     } 

     public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      List<string> items = db.DynamicPages.Select(p => p.Url).ToList(); 

      if (items.Contains(values["dynamicPageFriendlyURL"])) 
      { 
       return true; 
      } 

      return false; 
     } 
    } 

Startup.cs:

public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(ConnectionString)); 

     services.Configure<RouteOptions>(options => 
     { 
      options.ConstraintMap.Add(DynamicPageRouteConstraint.ROUTE_LABEL, typeof(DynamicPageRouteConstraint)); 
     }); 

     services.AddMvc(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     ... 

     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "DynamicPageRoutes", 
       template: "{*dynamicPageFriendlyURL:" + DynamicPageRouteConstraint.ROUTE_LABEL + "}", 
       defaults: new { controller = "DynamicPage", action = "Loader" }, 
       constraints: new { dynamicPageFriendlyURL = new DynamicPageRouteConstraint(app.ApplicationServices.GetRequiredService<ApplicationDbContext>()) }); 

      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 

私の問題は、このようにしている:

コードそれが行方不明を訴え、すぐに立っているようstartup.csで自分のルートに遭遇するとすぐに、パラメータのないコンストラクタを呼び出します。

私はRouteConstraintの実装にパラメータのないコンストラクタを置くと、コードが動作するようになりますが、ルートをたどるときに、依存関係が注入された後にもう一度2回ヒットします。 dbオブジェクトはインスタンス化されます。

新しいdbcontextオブジェクトをインスタンス化して接続文字列を指定する必要があり、実装したdev/production接続文字列セットアップで大きなレンチを投げるので、dbContextを注入したくないのです。

私の質問:

なぜパラメータのないコンストラクタが必要ですか?

なぜ私のルートは2回呼び出されるのですか? (注入ctrで1回、パラメータなしのctrで1回)

IRouteConstraintの実装に依存性注入を行う良い方法はありますか?

これを行うには良い方法がありますか?私はデータベースに格納されたページのカスタムURLを提供しようとしています。

ご協力いただきましてありがとうございます。ありがとう!

答えて

2

私はあなたのMapRouteで2度、テンプレートパラメータ(システムがコンストラクタなしの制約クラスのインスタンスを作成する)で1回、次にconstraintパラメータで制約を2回適用していると思います。私はあなたの答えは、テンプレートレベルでの制約を適用しようとはしませんだけで

template: "{*dynamicPageFriendlyUrl}" 

次にシステムにテンプレートを変更することだと思います。

+0

ありがとうございました!これは、ダブルコールと依存性注入/コンストラクタの両方の問題を解決しました。 –

関連する問題