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