【问题标题】:Inject values into custom VAB validator将值注入自定义 VAB 验证器
【发布时间】:2023-03-09 04:20:01
【问题描述】:

我正在构建一个 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; }
}

【问题讨论】:

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


    【解决方案1】:

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

    如果全部失败,您可以使用LevelValidator 中的服务定位器模式(最好保留属性)并从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 的控制范围内。

    【讨论】:

    • 我相信在进行基于配置的验证时可以防止这种类型的设计。在这种情况下,VAB 允许您拦截和替换某些部分,这允许您使用依赖注入创建验证器。不过有一个警告:我浏览了 VAB 源代码并没有找到一种简单的方法来做到这一点。我预计您需要更换相当一部分的 VAB 基础架构,从 ConfigurationValidatorFactory 开始。我不建议您为此浪费时间。
    • 非常感谢史蒂文! :)
    • 我最终得到了这个:public abstract class InjectedValueValidatorAttribute : ValueValidatorAttribute { public static IUnityContainer Container { get; set; } }
    猜你喜欢
    • 2017-07-27
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多