1

我需要根據可能使用其他註冊服務的數據庫驗證字段。我一直在閱讀documentation,但還沒有找到實際的答案。針對數據庫的ASP.NET核心自定義驗證

有遠程驗證調用控制器方法,但它只是客戶端,所以禁用JS禁用驗證。還有使用驗證屬性的自定義驗證,並且很好地包含在ModelState.IsValid中,但我無法在其構造函數中注入依賴項。

我發現this question被標記爲回答,因爲它提到了依賴關係解析器,但我找不到任何有用的信息。

我試過研究它,但所有我碰到的只是依賴注射或IServiceProvider這對我不起作用。下面是我的一些失敗的嘗試:

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     //--1------------------------------- 
     var container = new ServiceContainer(); 
     var _context = container.GetService<ApplicationDbContext>(); 
     //---------------------------------- 

     //--2------------------------------- 
     var services = new ServiceCollection(); 
     IServiceProvider servicesProvider = services.BuildServiceProvider(); 
     var _context = servicesProvider.GetService<ApplicationDbContext>(); 
     //---------------------------------- 

     return ValidationResult.Success; 
    } 

每個檢索_context爲空。我真的已經用盡了所有想法,我會很感激任何幫助。

+0

你不應該像[表達] [這裏](https://stackoverflow.com/a/29916075/264697),[這裏](http://blog.ploeh.dk/2014/06/13)/passive-attributes /)和[here](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=97)。 – Steven

回答

1

我正面臨類似的問題。我嘗試了一些「不完整」的方式(以防萬一「不得不」)。就像我用電子郵件的DuplicateMatch屬性卡住了 - 這需要數據庫訪問,而且我的自定義validationAttribute中沒有可用的東西。

  1. 我DAL是單獨的項目,所以不是純粹的DI(依賴注入) - 我不停的DBConext初始化在DAL(它有自己的appSettings.json),所以沒有別的正在困擾傳遞的DbContext等。 。只需調用DAL(或服務層),它就可以自己初始化一個DBContext。
  2. 以某種方式使用「服務定位器」模式獲取DBContext的實例以及爲DI配置的任何其他對象 - 尚未測試。
  3. 服從DI模式,並做我的DuplicateMatch或任何其他此類驗證(這需要控制器操作本身或服務層中的DAL訪問),而不是與驗證屬性。

讓我知道這些是否有幫助。我有興趣從社區瞭解更多有關不違反DI模式的方法(如3.)。

+0

謝謝你的回答,我嘗試了@Steven的一些建議,但我認爲我沒有必要的知識來完全理解它們,並且對於這樣一個(看似)簡單的任務似乎有很多工作要做。我結束了使用第三種方式,我把驗證放在一個服務中。不像屬性那樣優雅的解決方案,但它看起來很安全,並保持它在服務中允許控制器保持相對乾淨。由於我現在有很多工作,我會看看你的其他建議。 – Bielik