0

我爲一個實體使用CustomValidation,並且我想在其中注入Repository。驗證方法必須是靜態的。有什麼方法可以在服務位置以外的靜態上下文中注入對象?如何在自定義驗證器中注入某些東西?

這裏是我的元數據:

[MetadataTypeAttribute(typeof(BillPosition.BillPositionsMetadata))] 
[CustomValidation(typeof(BillPositionValidator), "ValidateBillPositionsCount")] 
public partial class BillPosition 
{ 
    internal sealed class BillPositionsMetadata 
    { 
     private BillPositionsMetadata() { } 

     public int BillId { get; set; } 
    } 
} 

這裏的驗證碼:

public class BillValidator 
{ 
    [Inject] 
    public static IRepository Repository { get; set; } 

    public static ValidationResult ValidateBillPositionsCount(BillPosition bill, ValidationContext context) 
    { 
     ValidationResult result = ValidationResult.Success; 

     /* Repository wasn't injected and I get null reference exception */ 
     var billPositions = Repository.BillPositions.Count(position => position.BillId == bill.BillId); 
     if (bill.BillPositions.Count == 0 && billPositions == 0) 
     { 
      result = new ValidationResult("Invalid positions count", new[] { "BillPositions" }); 
     } 

     return result; 
    } 
} 

回答

0

你可以只調用了國際奧委會和解決的依賴。就像我使用Unity一樣。在這種情況下,我會叫Bootstrapper.Unity.Resolve(「NameOfMyDependency」)

0

如果不解決從依賴注入容器的驗證,仍然可以解決存儲庫直接使用某種服務定位器:

public class BillValidator 
{ 
    static BillValidator() 
    { 
     Repository = ServiceLocator.Current.GetInstance<IRepository>(); 
    } 

    public static IRepository Repository { get; set; } 
} 

這樣,你可以使用new -keyword初始化驗證:

var validator = new BillValidator(); 

,你仍然可以在驗證解決的依賴。

由於存儲庫在類型初始值設定項中得到解析,所以在應用程序中每個類型只執行一次。驗證器的所有實例都將使用同一個存儲庫。

此代碼適用於Unity,但在使用MEF或其他容器時應該相當。

相關問題