.NET:ModelStateDictionary适配器?

时间:2015-12-22 02:10:39

标签: c# asp.net-mvc modelstatedictionary

所以,我一直在乱用.NET中的验证,试图找到一种在业务层实现验证的良好方法(如本MSDN article中所述)。

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

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

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

所以,我想知道是否有人就如何处理此问题提出了建议?

我的尝试是创建一个适配器/ Inteface IModelStateDictionary,我得到了... 但是,Modelstate使用ValueProviderResult class(也就是System.Web.MVC),它具有 虚拟方法 ConvertTo()。我不知道如何解决这个问题...可能是一个我还没有学到的简单模式,但是根据我的经验水平我不确定它是否真的是一个显示停止......

......还是我可以更好地解决这个问题?

建议最值得赞赏!

谢谢,

克里斯

编辑:以下代码

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);
    }

}

0 个答案:

没有答案