我正在构建一个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; }
}
答案 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的控制范围。