我正在使用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();
}
答案 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正是这样做的,因为保存项目可能不是它的关注点。我推荐第二种方法。