Вопрос о многоуровневой архитектуре - PullRequest
2 голосов
/ 24 августа 2010

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

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 Ответ

1 голос
/ 24 августа 2010

Пока все хорошо.

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

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

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

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

...