Asp.net 具有实体框架的业务逻辑体系结构

Asp.net 具有实体框架的业务逻辑体系结构,asp.net,entity-framework,repository-pattern,dao,unit-of-work,Asp.net,Entity Framework,Repository Pattern,Dao,Unit Of Work,我使用实体框架,我有如下实体: public class User : IEntity { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } [Required] public String Email { get; set; } p

我使用实体框架,我有如下实体:

    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; }
}
公共类用户:IEntity
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId{get;set;}
[必需]
公共字符串电子邮件{get;set;}
公共虚拟ICollection用户项目{get;set;}
}
公共课项目:科学性
{
[关键]
公共int ProjectId{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
[外键(“用户所有者”)]
public int UserOwnerId{get;set;}
公共虚拟用户UserOwner{get;set;}
}
我还使用了存储库模式和工作单元模式。 例如,我有一个方法 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();
    } 
public void CreateNewProject(字符串projectName、字符串描述、字符串usersEmail)
{
var usersLogic=kernel.Get();
User owner=usersLogic.GetUserByEmail(usersEmail);
单元.储存库()
.插入(新项目)
{
Title=projectName,
描述=描述,
CreationDate=日期时间。现在,
UserOwner=owner,
usersincludedinproject=新列表()
});
单位。保存();
} 

业务逻辑和实体框架(或任何其他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正是这样做的,因为它可能不关心保存项目。我建议使用第二种方法。

但如果我想分离数据层实体并使用数据传输对象。在这种情况下,我的业务层不应该知道实体。var user=_usersService.GetByEmail();-这将是不正确的。如果我错了,请纠正我。也许我忘了说应用程序是wep api项目,但我认为这无关紧要。存储库/服务将返回应用程序实体,一个适合该上下文的用户对象。这不是用户EF实体。该服务将使用EF查询数据库,然后将结果映射到业务用户对象,但我仍然想知道:在web服务应用程序中删除实体是否是个好主意,因为客户端应该具有相同的数据库结构。等等,这意味着,我必须将几乎所有的EF模型复制到业务对象。我的意思是,在大多数情况下,它将具有相同的结构。