0

I`m с помощью Entity Framework и я сущности, как это:бизнес-логика Архитектура с Entity Framework

public class User : IEntity 
    { 
     [Key] 
     [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
     public int UserId { get; set; } 
     [Required] 
     public String Email { get; set; } 

     public virtual ICollection<Project> UserProjects { get; set; } 
    } 

public class Project : IEntity 
{ 
    [Key] 
    public int ProjectId { get; set; } 

    public String Title { get; set; } 

    public String Description { get; set; } 

    [ForeignKey("UserOwner")] 
    public int UserOwnerId { get; set; } 
    public virtual User UserOwner { get; set; } 
} 

Также я использую Repository шаблон и единицу работы шаблона. Например, у меня есть метод CreateProject (String title, String description, String userOwnerEmail) в классе логических проектов, который содержит только Project Repository. Также у меня есть класс UserLogic, который позволяет мне получить пользователя по его электронной почте.

Как я могу получить пользователя по электронной почте в методе CreateProject, чтобы назначить его как владельца проекта.

Основная цель - создать метод ослабленной связи.

Я думаю, что этот пример плохо:

public void CreateNewProject(String projectName, String description,String usersEmail) 
    { 
     var usersLogic = kernel.Get<IUsersServices>(); 
     User owner = usersLogic.GetUserByEmail(usersEmail); 
     unit.Repository<Project>() 
      .Insert(new Project 
       { 
        Title = projectName, 
        Description = description, 
        CreationDate = DateTime.Now, 
        UserOwner = owner, 
        UsersIncludeedInProject = new List<User>() 
       }); 
     unit.Save(); 
    } 

ответ

0

бизнес-логики и Entity Framework (или любой другой ORM) не принадлежат одной и той же фразе. Принцип разделения интересов - это принцип.

class Project 
{ 
    public Project(IProjectRepository repo, IUsersServices userServ){} 

    public void CreateNewProject(String projectName, String description,String usersEmail) 
     { 
      var owner=_users.GetByEmail(usersEmail); 

      //create project\\ 

      _repository.Save(project); 
     } 

Еще один подход заключается в передаче объекта пользователя в качестве аргумента, объект, который вы получите, задавая UserService или даже UserRepository к GetUserByEmail(). Но это будет за пределами метода CreateNewProject

var user= _usersService.GetByEmail(); 
var project=project.CreateNewProject(projectName,projectDescription,user); 
_projectRepository.Save(project); 

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

+0

Но если я хочу абстрагировать объекты уровня данных и использовать объекты передачи данных. В этом случае мой бизнес-уровень не должен знать об объектах. var user = _usersService.GetByEmail(); - это будет неуместно. Пожалуйста, поправьте меня, если я ошибаюсь. – Dmitry

+0

Возможно, я забыл сказать, что приложение является проектом wep api, но я думаю, что это не имеет значения. – Dmitry

+0

Репозиторий/Служба вернет объекты приложения, объект User, подходящий для этого контекста. Это не объект User EF. Служба будет использовать EF для запроса db, а затем отображает результат в бизнес-объект пользователя. – MikeSW

Смежные вопросы