Как внедрить зависимости, используемые для валидации в .NET MVC3?

У нас довольно много методов валидации, которым для выполнения своей работы требуется доступ к хранилищам / базе данных. До сих пор мы использовали паттерн service locator (хотя и нечасто) для этого в пользовательских ValidationAttributes:

public override bool IsValid(object value)
{
    // use custom service locator in our app's infrastructure
    var repos = DependencyInjector.Current.GetService();
    ...
}

Я знаю, что это анти-паттерн, и мы хотели бы использовать более правильный подход. Мы используем unity, и я прочитал этот пост, в котором говорится об использовании метода build-up. Однако ссылка в принятом ответе говорит, что документация устарела (устаревший контент).

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

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

Также мы иногда используем [RemoteAttribute] для выполнения некоторых из этих проверок на клиенте. В настоящее время эти методы строят вью-модель и передают валидацию модели с помощью статического метода Validator.TryValidateObject.

Как вы выполнили валидацию, которая требует инжектированной зависимости для выполнения своей работы, не используя анти-паттерн SL?

14
задан Community 23 May 2017 в 11:45
поделиться