因此,我一直在搞乱 .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);
}
}