我们系统的用户可以提交未经验证的联系人数据。例如:
此数据存储在PendingContacts表中。
我有另一张桌子 - ApprovedContacts。该表具有各种约束以提高一致性和完整性。该表不应包含任何脏的或不完整的数据。
我需要一个进程将数据从一个表移动到另一个表。两个表的结构几乎相同,但是,一个表具有约束,而另一个表没有。
我有两种状态:Pending和Approved,直觉告诉我应该使用状态模式details here。理论上,这应该允许我将联系人的状态从Pending更改为Approved,具体取决于联系人是否已成功验证。问题是我看不出这是怎么回事。
我是朝着正确的方向前进,还是应该看一些完全不同的东西?
表示层位于MVC 3中,因此我有待处理联系人和已批准联系人的查看模型,以及待处理联系人和已批准联系人的域模型。我的视图模型通常是带有一些验证例程的DTO,但现在我的视图模型也表示状态。这似乎不对。
例如,所有联系人都必须具有状态,并且可以保存和删除它们,因此我需要一个接口:
public interface IContactViewModelState
{
void Save(ContactViewModel item);
}
然后我添加了一个用于将待处理联系人保存到PendingContacts表中的实现:
public class PendingContactViewModelState: IContactViewModelState
{
public void Save(ContactViewModel item)
{
// Save to the pending contacts table
// I don't like this as my view model now references data access layer
}
}
答案 0 :(得分:1)
简短回答:不,因为你只有两个州。您将使用状态模式来帮助处理具有许多状态和规则的复杂情况。您可能希望采用基于状态模式的全面实施的唯一原因是,如果您很有可能出现这样的情况。
如果成功转换为Approved的结果是最终在批准的表中的记录,那么您实际上只需要确定要强制执行约束的位置。这个决定将/可以基于许多因素,包括可能的变化频率(对约束)和其他逻辑所在的位置。
许多模式(但不是全部)倾向于处理如何构建应用程序,但在这里我认为这只是决定实现某些逻辑的位置和方式的一种情况。换句话说 - 你可能只是意外地过度分析问题 - 这很容易做到:)