0

Я использую CustomValidation для одного объекта, и я хочу ввести в него репозиторий. Метод проверки должен быть статичным. Есть ли способ внедрить объект в статический контекст, отличный от местоположения службы?Как добавить что-то в пользовательский валидатор?

Вот мои метаданные:

[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

Существует не способ привнести в пользовательских валидаторов. Локатор сервисов или некоторая форма отражения могут использоваться для доступа к свойству или методу в экземпляре, на котором выполняется валидатор. Вы можете получить доступ к этому экземпляру через ValidationContext.

http://www.jaltiere.com/index.php/2010/05/04/ninject-with-mvc-and-validationattributes/

0

Вы можете просто позвонить IoC и устранить зависимость. Как я использую Unity. В этих случаях я бы назвал Bootstrapper.Unity.Resolve («NameOfMyDependency»)

0

Если вы не разрешение валидатора из контейнера инъекции зависимостей, вы можете разрешить хранилище непосредственно с помощью какого-то службы локатора:

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

    public static IRepository Repository { get; set; } 
} 

Таким образом, вы можете инициализировать валидатор, используя new -ключевое слово:

var validator = new BillValidator(); 

и вы все равно получите зависимость разрешенное в валидатор.

В связи с тем, что репозиторий получает разрешение в инициализаторе типа, он будет выполняться только один раз для каждого типа в вашем приложении. Все экземпляры валидатора будут использовать один и тот же репозиторий.

Этот код работает при работе с Unity, но должен быть эквивалентен при работе с MEF или другими контейнерами.

Смежные вопросы