1

因此,我一直在搞乱 .NET 中的验证,试图找到一种在业务层中实现验证的可靠方法(例如这篇MSDN 文章中所讨论的)。

这个想法是我将控制器的 ModelState 传递给业务服务,然后服务执行验证并更新 ModelState。

但是,我注意到的一件事是 ModelStateDictionary 存在于两个不同的命名空间中:

虽然我可以“选择一个”,但我不希望我的业务层对表示层有任何依赖。例如,如果我选择 MVC,则业务服务类需要期待 ModelStateDictionary 的MVC 命名空间版本......这意味着它们将依赖于 MVC 表示层。

所以,我想知道是否有人对如何解决这个问题有建议?

我的尝试是创建一个适配器/接口 IModelStateDictionary,我接近了……但是,Modelstate 使用了一个具有虚拟方法ConvertTo()的ValueProviderResult 类(也是 System.Web.MVC)。我不确定我该如何解决这个问题......可能是一个我还没有学过的简单模式,但以我的经验水平,我不确定它是否真的是一个表演终结者......

...或者我可以以更好的方式解决这个问题?

建议将不胜感激!

谢谢,

克里斯

编辑:下面的代码

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Common.Interfaces
{
    public interface IModelStateDictionary
    {
        IModelState this[string key] { get; set; }
        int Count { get; }      
        bool IsReadOnly { get; }       
        bool IsValid { get; }      
        ICollection<string> Keys { get; }       
        ICollection<IModelState> Values { get; }
        void Add(KeyValuePair<string, IModelState> item);      
        void Add(string key, IModelState value);        
        void AddModelError(string key, string errorMessage);       
        void AddModelError(string key, Exception exception);       
        bool Contains(KeyValuePair<string, IModelState> item);        
        bool ContainsKey(string key);       
        void CopyTo(KeyValuePair<string, IModelState>[] array, int arrayIndex);      
        IEnumerator<KeyValuePair<string, IModelState>> GetEnumerator();        
        bool IsValidField(string key);       
        void Merge(IModelStateDictionary dictionary);      
        bool Remove(string key);     
        bool Remove(KeyValuePair<string, IModelState> item);     
        void SetModelValue(string key, IValueProviderResult value);    
        bool TryGetValue(string key, out IModelState value);
    }

    public interface IModelState
    {
        IModelErrorCollection Errors { get; }
        IValueProviderResult Value { get; set; }
    }

    public interface IValueProviderResult
    {
        string AttemptedValue { get; protected set; }
        CultureInfo Culture { get; protected set; }
        object RawValue { get; protected set; }
        object ConvertTo(Type type);
        virtual object ConvertTo(Type type, CultureInfo culture);
    }

    public interface IModelErrorCollection
    {
        void Add(string errorMessage);
        void Add(Exception exception);
    }

}
4

0 回答 0