Вставить значения в пользовательский VAB-валидатор - PullRequest
0 голосов
/ 19 апреля 2011

Я создаю веб-приложение mvc, которое делит объекты модели с существующим приложением winforms.Я ввожу проверку VAB в это.Один из элементов, который мне нужно проверить, - это int, который может быть одним из уровней x.

Я написал LevelValidator, но он должен иметь доступные уровни.

Относительно new вызовите в этом коде, похоже, я должен ввести LevelValidator вместо Levels ?Другие способы?

public class LevelValidatorAttribute : ValueValidatorAttribute
{
    protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType)
    {
        LevelValidator validator = new LevelValidator();
        validator.Levels = this.Levels;
        return validator;
    }

    [Dependency]
    public Levels Levels { get; set; }
}

1 Ответ

1 голос
/ 19 апреля 2011

Нельзя использовать внедрение зависимостей для атрибутов, поскольку атрибуты не контролируются и не создаются средой внедрения зависимостей, а контролируются самим CLR. Попробуйте создать дизайн, если ваш атрибут не требует внедрения зависимостей.

Если все не удается, вы можете использовать шаблон локатора службы внутри LevelValidator (лучше всего оставить атрибут allone) и выполнить вызов контейнера Unity из класса LevelValidator. Чтобы это работало, вам нужно иметь статическое поле, содержащее контейнер. Например:

public class LevelValidator : Validator
{
    public static UnityContainer Container { get; set; }

    public LevelValidator()
    {
        this.Levels = Container.Resolve<Levels>();
    }

    public Levels Levels { get; set; }
}

В пути запуска вашего приложения вам нужно установить это статическое свойство Container следующим образом:

public void Main()
{
    var container = new UnityContainer();

    // configure it

    LevelValidator.Container = container;
}

Это решение далеко от идеального и должно быть предотвращено в большинстве случаев. Однако создание атрибута и LevelValidator находится вне контроля Unity.

...