所以,我一直在乱用.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);
}
}