Asp.net 具有实体框架的业务逻辑体系结构
我使用实体框架,我有如下实体:Asp.net 具有实体框架的业务逻辑体系结构,asp.net,entity-framework,repository-pattern,dao,unit-of-work,Asp.net,Entity Framework,Repository Pattern,Dao,Unit Of Work,我使用实体框架,我有如下实体: public class User : IEntity { [Key] [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] public int UserId { get; set; } [Required] public String Email { get; set; } p
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; }
}
公共类用户:IEntity
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId{get;set;}
[必需]
公共字符串电子邮件{get;set;}
公共虚拟ICollection用户项目{get;set;}
}
公共课项目:科学性
{
[关键]
公共int ProjectId{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
[外键(“用户所有者”)]
public int UserOwnerId{get;set;}
公共虚拟用户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();
}
public void CreateNewProject(字符串projectName、字符串描述、字符串usersEmail)
{
var usersLogic=kernel.Get();
User owner=usersLogic.GetUserByEmail(usersEmail);
单元.储存库()
.插入(新项目)
{
Title=projectName,
描述=描述,
CreationDate=日期时间。现在,
UserOwner=owner,
usersincludedinproject=新列表()
});
单位。保存();
}
业务逻辑和实体框架(或任何其他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正是这样做的,因为它可能不关心保存项目。我建议使用第二种方法。但如果我想分离数据层实体并使用数据传输对象。在这种情况下,我的业务层不应该知道实体。var user=_usersService.GetByEmail();-这将是不正确的。如果我错了,请纠正我。也许我忘了说应用程序是wep api项目,但我认为这无关紧要。存储库/服务将返回应用程序实体,一个适合该上下文的用户对象。这不是用户EF实体。该服务将使用EF查询数据库,然后将结果映射到业务用户对象,但我仍然想知道:在web服务应用程序中删除实体是否是个好主意,因为客户端应该具有相同的数据库结构。等等,这意味着,我必须将几乎所有的EF模型复制到业务对象。我的意思是,在大多数情况下,它将具有相同的结构。