差异方法验证用户输入和服务层命令?

时间:2011-09-13 07:04:12

标签: asp.net-mvc validation

在分层应用程序中,服务层等待命令和Web应用程序(asp.net MVC 3)发出命令,我有:

// In the service layer
public class MyCommand
{
    public string MyVal { get; set;}
    public string AnotherProperty { get; set;}
}


// In the web layer
public class MyCommandViewModel
{
    public string MyVal { get; set;}
}

viewmodel类与用户表单匹配,而命令类与业务层要求匹配。由于表单不允许用户输入AnotherProperty,因此我没有在viewmodel中包含此属性。

现在我有一个业务规则,要求我的命令的MyVal属性是必需的,不应超过20个字符。在这种分层应用程序中,实现此类验证的准则是什么?

我看到了几种可能性:

1。在两个类

上使用System.ComponentModel.DataAnnotations
// In the service layer
public class MyCommand
{
    [Required]
    [StringLength(20)]
    public string MyVal { get; set;}
    public string AnotherProperty { get; set;}
}


// In the web layer
public class MyCommandViewModel
{
    [Required]
    [StringLength(20)]
    public string MyVal { get; set;}
}

此方法正常,但我必须“复制”验证属性。如果明天,我将不得不允许40个字符,我将不得不“找到并希望没有遗漏”所有StringLength实例。

2。使用System.ComponentModel.DataAnnotations.MetadataType

这里的想法是在界面中提取规则(感谢Erik Philips的想法)

// In the service layer
public class IMyCommandMetaData
{
    [Required]
    [StringLength(20)]
    public string MyVal { get; set;}      
}

[MetadataType(typeof(IMyCommandMetaData))]
public class MyCommand
{     
    public string MyVal { get; set;}
    public string AnotherProperty { get; set;}
}


// In the web layer
[MetadataType(typeof(IMyCommandMetaData))]
public class MyCommandViewModel
{
    public string MyVal { get; set;}
}

这种方法也有效。专业人员我只定义一次规则,即元数据类型需要在附加对象上定义所有属性。 我要么在我的viewmodel中实现所有属性,即使没有使用,要么只在服务层中包含与UI关联的元数据属性(不考虑分层原则)。

3。创建特定的验证属性

我想到的另一个选择是创建专门的验证属性。例如:

// In the service layer
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class MyValValidationAttribute : ValidationAttribute
{
    public MyValValidationAttribute () : base() { }
    public MyValValidationAttribute (Func<string> errorMessageAccessor) : base(errorMessageAccessor){}
    public MyValValidationAttribute (string errorMessage) : base(errorMessage) {}

    public override bool IsValid(object value)
    {
        var isValid = true;
        var valueStr = value as string;
        if (valueStr != null)
        {
            isValid = valueStr.Length <= 20;
        }
        return isValid;
    }
}

public class MyCommand
{
    [Required]
    [MyValValidation]
    public string MyVal { get; set;}
    public string AnotherProperty { get; set;}
}


// In the web layer
public class MyCommandViewModel
{
    [Required]
    [MyValValidation]
    public string MyVal { get; set;}
}

这种方法的优点是,我可以将一个规则的验证集中在一个地方。结果是我必须为每个验证规则创建几乎一个属性。


另一种可能性是使用第三方验证框架而不是OOB验证框架,但我没有看到好处(特别是因为asp.net mvc使用此框架来创建表单的验证)。

在分层应用程序中,有很多业务验证规则,最佳选择是什么?我的目标是更具发展性的应用程序。

提前感谢您的意见和建议。

PS:这个问题来自于other question

0 个答案:

没有答案