【问题标题】:Business Logic Architecture with Entity Framework带有实体框架的业务逻辑架构
【发布时间】:2013-04-17 08:09:43
【问题描述】:

我正在使用实体框架,我有这样的实体:

    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(字符串标题,字符串描述,字符串 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();
    } 

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 但是如果我想抽象数据层实体并使用数据传输对象。在这种情况下,我的业务层不应该知道实体。 var user= _usersService.GetByEmail(); - 这将是不正确的。如果我错了,请纠正我。
    • 可能我忘了说application是wep api项目,但我觉得没关系。
    • 存储库/服务将返回应用程序实体,即适合该上下文的用户对象。那不是 User EF 实体。 Service 将使用 EF 查询数据库,然后将结果映射到业务用户对象
    • 但我仍然想知道:在 Web 服务应用程序中放弃实体是个好主意,因为客户端应该具有相同的数据库结构。
    • 等等,这意味着我必须将几乎所有的 EF 模型复制到业务对象。我的意思是,在大多数情况下,它将具有相同的结构。
    猜你喜欢
    • 2011-04-15
    • 2013-09-14
    • 2012-03-08
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多