У меня есть эта открытая операция в моем сервисе:
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 имеет доступ к контексту объекта и вызывает хранимую процедуру для удаления каждого элемента в приложении коллекции. Приглашения.Я сделал так, чтобы не загружать все приглашения в память, а только удалить их на следующем шаге.Мой 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);
}
Что вы думаете об этом?Любые предложения?
Некоторые требования, которые я поставил:
- Сервисный код должен вызывать только методы хранилища и сущности
- Репозиторий должен быть общим
- Сущности не должны иметь доступа к контексту объекта