0

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

我写了一个 LevelValidator,但它需要有可访问的级别。

关于此代码中的调用,看起来我应该注入 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; }
}
4

1 回答 1

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 无法控制的。

于 2011-04-19T18:16:19.857 回答