如何在ViewModel类上实现依赖注入?

时间:2011-06-13 09:00:37

标签: asp.net-mvc-3 dependency-injection nunit structuremap

我有一个视图模型类,它有一个方法,它使用DateTime.Now基于viewmodel上的日期与当前时间之间的时间段进行计算。

我希望能够对方法进行单元测试,因此我使用的是时间服务,可以在我的测试中存根。但是,需要以某种方式将依赖项注入viewmodel类。当视图模型回发到控制器时,如果在视图模型列表中添加条目,则将其传递给控制器​​方法的参数。我想在那时自动将日期服务传递给viewmodel。

有谁知道如何实现这一目标?我正在使用Mvc3和StructureMap。

2 个答案:

答案 0 :(得分:3)

我不会在视图模型上进行此类计算。在视图模型上,我会坚持使用POCO属性。在将域模型映射到视图模型时,我会执行此计算。这可以在控制器操作中或您可以访问服务层的映射层中完成。

答案 1 :(得分:0)

您可以编写一个自定义DOB验证器,而不是在viewmodel中编写一个方法来验证DOB:

public static ValidationResult DOBValidator(DateTime DOB)
    {
        if (DOB!= null && DOB.Date != DateTime.MinValue.Date)
        {
            int age = DateTime.Now.Year - DOB.Year;
            if (age < 18)
            {
                return new ValidationResult("Sorry, age should be more than 18 years");
            }
        }

        return ValidationResult.Success;
    }
}

然后你可以在viewmodel中装饰你的DOB属性,例如:

[CustomValidation(typeof(ViewModelClassName), "DOBValidator")]

在单元测试中,您可以调用viewmodel方法并传递一个虚拟日期时间值:

DateTime testDOB = DateTime.Now.AddYears(-18);
        ValidationResult result = ViewModelObject.DOBValidator(testDOB);
        Assert.AreEqual(ValidationResult.Success, result, "The ValidationResult was incorrect");

希望这有帮助。