2010-10-06 75 views
0

这是我的情况。我的解决方案结构如下。从单独项目中的验证类填充MVC视图模型

Project用来处理路径,显示数据,...

Project.Core用于处理业务逻辑,验证,查询,...

Project.Core我有我的验证DTO(一个验证类数据传输对象)。

我的验证类(在Project.Core):

public class IncidentValidator<T> : IValidator<T> 
    where T : AuditReport 
{ 
    public IncidentValidator(IList<T> ar) 
    { 
     AR = ar; 
    } 

    public IList<T> AR { get; set; } 

    public IList<Model> Validate() 
    { 
     var list = new List<Model>(); 
     foreach (T ar in AR) 
     { 
      list.Add(new Model 
         { 
          IncidentId = new KeyValuePair<int, RuleType>(
           ar.IncidentId, 
           new OccurrenceCountRule(ar).RulesValidate() 
           ), 
          Circuit = new KeyValuePair<string, RuleType>(
           ar.Circuit, 
           new CircuitRule(ar).RulesValidate() 
           ) 
         }); 
     } 

     return list; 
    } 
} 

我的观点模型(Project):

public class Model 
{ 
    public KeyValuePair<int, RuleType> IncidentId { get; set; } 
    public KeyValuePair<string, RuleType> Circuit { get; set; } 
} 

所以我的问题是,应该Project.Core参考Project有机会获得我的视图模型所以我的验证类可以填充它?然而,我不太喜欢这种方法。我想过在我的控制器内部进行验证,但也不喜欢这个想法。也许我的观点模型可以在Project.Core之内生存或者被认为是不好的设计?

我能做些什么?

回答

2

如果此验证程序类旨在验证视图模型,那么您应该将它放在与包含视图模型的项目相同的项目中。另一种可能性是将视图模型外部化为一个单独的程序集,您可以参考Project.Core(尽管第一种方法似乎更好)。在任何情况下,您都不应在Project.Core中提及Project

+0

验证器将负责验证我的DTO并在视图模型中填充结果。 – Mike 2010-10-06 18:25:00

2

为每个视图模型类型创建一个接口,该接口驻留在Project.Core中,并让实际视图模型实现接口并驻留在Project中。这样,你就可以使用你需要的东西在Project.Core进行验证,而不必关心实现。

1

我想说,在控制器中创建一个组件来管理验证过程(框架现在在控制器中进行验证),所以控制器不必做很多工作,除了委托到另一个进程。此外,接口可以工作,或者您可以利用另一种设计模式进行验证。也许验证工厂可以包含一个验证器接口,但验证器逻辑驻留在模型的Project中。

HTH。