将值注入自定义VAB验证器

时间:2011-04-19 14:35:46

标签: dependency-injection unity-container enterprise-library validation-application-bl

我正在构建一个mvc webapp,它与现有的winforms应用程序共享模型对象。我正在引入VAB验证。我需要验证的一个项目是一个可以是x级别之一的int。

我写了一个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 个答案:

答案 0 :(得分:1)

您不能对属性使用依赖项注入,因为属性不是由依赖项注入框架控制和创建的,而是由CLR本身控制。尝试设计你的属性不需要依赖注入。

如果全部失败,您可以使用LevelValidator内的服务定位器模式(最好将属性保留为allone)并从LevelValidator类中调用unity容器。为此,您需要有一个容纳容器的静态字段。例如:

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的控制范围。