【发布时间】:2011-03-02 18:20:56
【问题描述】:
我的服务中有这个公共操作:
void IApplicationService.DeleteApplication(int id)
{
var repository = UnitOfWork.CreateRepository<Application>();
var application = repository.GetByKey(id);
OnCommit.Run(() => DeleteInvitations(id)); // ouch!!
repository.Delete(application);
}
OnCommit.Run() 安排在我调用 SaveChanges() 时运行的操作,在 WCF 检查器中实现。 DeleteInvitations 可以访问对象上下文并调用存储过程来删除集合 application.Invitations 中的每个项目。我这样做是为了避免将所有邀请加载到内存中,只是为了在下一步中删除它们。我的 Repository.Delete() 依次调用实体中的 Delete()。
但我不太喜欢由服务代码处理部分删除操作。我需要访问我的实体中的存储过程。
我想我可以制作一个 IStoredProcedures 接口并将其提供给每个实体。然后我可以有这样的东西:
public void Delete()
{
Contract.Requires(EntityState == System.Data.EntityState.Unchanged);
if (Responses.Any())
throw new ValidationException("There are responses.");
// *..* relationship, just break that
for (int i = Forms.Count - 1; i >= 0; i--)
{
var form = Forms.ElementAt(i);
Forms.Remove(form);
}
// I could have something like this, perhaps?
StoredProcedures.Call("DeleteInvitations", this.Id);
}
你对此有何感想?有什么建议吗?
我提出的一些要求:
- 服务代码只能调用存储库和实体方法
- 存储库应该是通用的
- 实体不得访问对象上下文
【问题讨论】:
标签: c# stored-procedures domain-driven-design repository entity