具有实体框架的业务逻辑架构

时间:2013-04-17 08:09:43

标签: asp.net entity-framework repository-pattern dao unit-of-work

我正在使用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模式和Unit Of Work模式。 例如我有方法 CreateProject(String title,String description,String userOwnerEmail) 在仅包含Project Repository的Projects逻辑类中。 我还有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();
    } 

1 个答案:

答案 0 :(得分:0)

业务逻辑和实体框架(或任何其他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);
       }

另一种方法是将User对象作为参数传递,通过向UserService或甚至UserRepository询问GetUserByEmail()来获取对象。但它将在CreateNewProject方法之外

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

在这种情况下,CreateNewProject正是这样做的,因为保存项目可能不是它的关注点。我推荐第二种方法。