2

Я разрабатываю часть программного обеспечения, где у меня есть несколько объектов, таких как:многоуровневая архитектура Вопрос

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(); 
} 

Репозитории имеют внутренний ObjectContext. У меня есть 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); 
     } 

    } 

Теперь я не уверен, что я иду в правильном направлении. Мой POCO которые являются (будет) отвечать за проверки и даст мне возможность сделать что-то вроде

SomeWorkspace.Children.Add(new Workspace {...}); 

Поскольку эти объекты связаны с контекстом, когда я сохранить их будут изменения в коллекцию также будет сохранены в базе данных ?

Кроме того, я хочу, чтобы мои игровые площадки не могли быть созданы без рабочей области и служб без игровой площадки. Где я должен их создавать и удалять?

Спасибо.

+1

Если вы не хотите, чтобы детская площадка была построена с рабочим пространством - добавьте требующие их конструкторы. То же самое для служб. –

+0

Да. Спасибо. – codegarten

ответ

1

До сих пор так хорошо.

Возможно, вы захотите переместить свой метод Save из хранилища и на единицу работы. В Entity Framework вам необходимо сохранить все изменения в контексте сразу; вы не можете сделать это для каждого типа. Помещение в репозиторий подразумевает, что будут сохранены только изменения в репозитории, что, вероятно, неверно.

Возможно, вы захотите реализовать каскад из рабочего пространства в игровое поле как каскады базы данных (которые инфраструктура Entity Framework будет распознавать и поддерживать) вместо их ручной кодировки.

Да, сохранение изменений в контексте сохранит все отслеживаемые изменения, включая связанные объекты.

Что касается добавления, если вы не раскрываете ObjectContext, то единственный способ, которым каждый сможет добавить игровое поле, - это отношения с объектами, которые вы просматриваете.

+0

Да, сохранение не должно быть в репозитории, и я изменю удаление на каскад. Теперь у меня возникли проблемы с установкой методов создания (мне нужна дополнительная обработка при создании службы (т. Е.)). Должны ли они быть местами в определенном объекте, например, DomainWorkspaceService, который я добавил выше? Спасибо – codegarten

+0

Мое правило состоит в том, что репозиторий строго инкапсулирует постоянство. Если это бизнес-логика, она идет на службу. Если это связано с постоянством (например, генерация идентификатора или что-то в этом роде), он переходит в репозиторий. Репозиторий должен быть довольно простым. –