Dependency injection 将值注入自定义VAB验证器

Dependency injection 将值注入自定义VAB验证器,dependency-injection,unity-container,enterprise-library,validation-application-bl,Dependency Injection,Unity Container,Enterprise Library,Validation Application Bl,我正在构建一个mvc webapp,它与现有的winforms应用程序共享模型对象。我将VAB验证引入其中。我需要验证的一个项目是一个int,它可以是x级别之一 我已经编写了一个LevelValidator,但它需要具有可访问的级别 关于这段代码中的new调用,看起来我应该注入LevelValidator而不是Levels? 其他方式 public class LevelValidatorAttribute : ValueValidatorAttribute { protected ov

我正在构建一个mvc webapp,它与现有的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; }
}

不能对属性使用依赖项注入,因为属性不是由依赖项注入框架控制和创建的,而是由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; }
}

这种解决方案远非理想,在大多数情况下都应该加以预防。但是,属性和
LevelValidator的创建不在Unity的控制范围内。

我相信在进行基于配置的验证时,可以防止这种类型的设计。在这种情况下,VAB允许您拦截和替换某些部分,这允许您使用依赖项注入创建验证器。不过有一个警告:我浏览了一下VAB源代码,并没有找到一个简单的方法来实现这一点。我希望您需要从
ConfigurationValidatorFactory
开始更换VAB基础设施的相当一部分。我不建议你在这件事上浪费时间。非常感谢你,史蒂文!:)我的结论是:
public抽象类InjectedValueValidatorAttribute:ValueValidatorAttribute{public static IUnityContainer容器{get;set;}}}
public void Main()
{
    var container = new UnityContainer();

    // configure it

    LevelValidator.Container = container;
}