0

我真的使用实体框架和我有这样的实体:业务逻辑架构与实体框架

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(字符串标题,字符串描述,字符串userOwnerEmail) 。 另外我有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

存储库/服务将返回适用于该上下文的应用程序实体和用户对象。这不是用户EF实体。该服务将使用EF来查询数据库,然后它将结果映射到业务用户对象 – MikeSW