Слоистая архитектура Вопрос
Вопрос
Я разрабатываю часть программного обеспечения, где у меня есть несколько сущностей, таких как:
public class Workspace
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<Playground> Playground { get; set; }
public virtual List<Workspace> Children { get; set; }
public virtual List<Member> Members { get; set; }
public virtual Workspace Parent { get; set; }
}
public class Playground
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual List<Service> Services { get; set; }
public virtual Workspace Workspace { get; set; }
}
public class Service
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual Playground Playground { get; set; }
}
Это мои объекты EF4 POCO. Я использую шаблон репозитория и следующий интерфейс:
public interface IRepository<T>
{
void Add(T entity);
void Delete(T entity);
IEnumerable<T> Get(Expression<Func<T, bool>> expression);
IEnumerable<T> Get();
void Attach(T entity);
int Save();
}
В репозитории есть внутренний объектContext. У меня есть UnitOfWork, которая содержит экземпляры моих репозиториев и отвечает за сохранение внесенных им изменений.
Я делаю это прямо сейчас?
Я реализую бизнес-логический слой, как это:
public class DomainWorkspaceService : DomainServiceBase
{
public DomainWorkspaceService(Workspace workspace)
: base(UnitOfWorkFactory.GetInstance())
{
}
public void Create(Workspace workspace)
{
UoW.GetRepository<Workspace>().Add(workspace);
}
public void Delete(Workspace workspace)
{
var pservice = new DomainPlaygroundService();
foreach (var playground in workspace.Playground)
pservice.Delete(playground);
foreach (var child in workspace.Children)
Delete(child);
}
}
Теперь я не уверен, что пойду в правильном направлении. Мои покомензатели (будут) ответственны за проверку и позволит мне сделать что-то вроде
SomeWorkspace.Children.Add(new Workspace {...});
Поскольку эти объекты связаны с контекстом, когда я сохраняю их, будут ли изменения в коллекциях также сохранены в базе данных?
Кроме того, я хочу, чтобы мои детские площадки не могут быть созданы без рабочего пространства и услуг без детской площадки. Где я должен создать и удалить их?
Спасибо.
Решение
Все идет нормально.
Вы, вероятно, хотите переместить Save
Метод выделения репозитория и на единицу работы. В рамках объекта вы должны сохранить все изменения в контексте одновременно; Вы не можете сделать это за тип. Положив его на репозиторий, подразумевает, что будут сохранены только изменения в репозитории, что, вероятно, не правильно.
Возможно, вы захотите реализовать каскад с рабочего пространства на игровую площадку в качестве каскадов базы данных (какая структура объекта будет распознаваться и поддерживать) вместо их вручную.
Да, сохранение изменений в контексте сохранит все отслеживаемые изменения, включая связанные объекты.
Что касается добавления, если вы не выставляете объектContext, то единственный способ, которым кто-то сможет добавить игровую площадку, является взаимосвязью с объектами, которые вы выставляете.