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; }
}

我也使用存储库模式和工作单元模式。例如,我在项目逻辑类中有方法 CreateProject(String title, String description, String 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();
    } 
4

1 回答 1

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 对象作为参数传递,您将通过向 GetUserByEmail() 询问 UserService 甚至 UserRepository 来获得对象。但它将在 CreateNewProject 方法之外

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

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

于 2013-04-17T08:50:45.480 回答