选项1不适合。它将工作的唯一方法是通过服务定位器反模式拉入依赖项。
选项2
不起作用
。尽管由于C#属性要求我无法看到这是如何实现的,但这是可能的。请参阅参考以下内容:
方案3:我不知道这个较早,但似乎是写验证是一个非常强大的方式使用ModelValidator类和相应的ModelValidatorProvider。
首先,创建自定义ModelValidatorProvider:
public class CustomModelValidatorProvider : ModelValidatorProvider
{
public CustomModelValidatorProvider(/* Your dependencies */) {}
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
if (metadata.ModelType == typeof(YourModel))
{
yield return new YourModelValidator(...);
}
}
}
ASP.NET MVC的IDependencyResolver将试图解决上述供应商,所以只要它与你的IoC容器注册,您不需要做任何事其他。然后ModelValidator:
public class EntryRatingViewModelValidatorMvcAdapter : ModelValidator
{
public EntryRatingViewModelValidatorMvcAdapter(
ModelMetadata argMetadata,
ControllerContext argContext)
: base(argMetadata, argContext)
{
_validator = validator;
}
public override IEnumerable<ModelValidationResult> Validate(object container)
{
if (/* error condition */)
{
yield return new ModelValidationResult
{
MemberName = "Model.Member",
Message = "Rating is required."
};
}
}
}
由于供应商通过IDependencyResolver
检索和提供者拥有返回ModelValidator
的I很容易能够注入的依赖关系和进行必要的验证完全控制。
我正在使用MVC5,但我认为上面它仍然相关。你说过“MVC的IDependencyResolver会尝试解决提供者”。但是,您将如何向IoC容器注册提供者? (在我的情况下统一)。 – Ben