C# 如何在n层体系结构中映射实体框架模型类和业务层类-ASP.NET-MVC
我正在MVC框架(ASP.NETMVC5,EntityFramework6)中研究电子层体系结构。我的应用程序分为三个子项目,分别是业务层、数据访问层、存储库(包括存储库和工作单元)和ASP.NET MVC web app。我正在努力理解业务数据和实体框架模型之间的映射。例如,如果实体框架中的模型类User为 DAL用户模型C# 如何在n层体系结构中映射实体框架模型类和业务层类-ASP.NET-MVC,c#,asp.net-mvc,asp.net-mvc-5,repository-pattern,n-tier-architecture,C#,Asp.net Mvc,Asp.net Mvc 5,Repository Pattern,N Tier Architecture,我正在MVC框架(ASP.NETMVC5,EntityFramework6)中研究电子层体系结构。我的应用程序分为三个子项目,分别是业务层、数据访问层、存储库(包括存储库和工作单元)和ASP.NET MVC web app。我正在努力理解业务数据和实体框架模型之间的映射。例如,如果实体框架中的模型类User为 DAL用户模型 [表(“用户”)] 公共类用户 { 公共用户(){} [关键] public int UserID{get;set;} [长度(250)] [必需] 公共字符串名{get;
[表(“用户”)]
公共类用户
{
公共用户(){}
[关键]
public int UserID{get;set;}
[长度(250)]
[必需]
公共字符串名{get;set;}
[长度(250)]
[必需]
公共字符串LastName{get;set;}
[必需]
公共整数{get;set;}
[长度(250)]
[必需]
公共字符串电子邮件地址{get;set;}
公共ICollection UserInGroup{get;set;}
}
在业务层,我有用户类
BLL-用户类
公共类用户
{
私有字符串用户标识;
私有字符串名;
私有字符串lastName;
私人互联网;
私有字符串电子邮件地址;
公共字符串用户ID
{
获取{return userID;}
设置{userID=value;}
}
公共字符串名
{
获取{return firstName;}
设置{firstName=value;}
}
公共字符串姓氏
{
获取{return lastName;}
设置{lastName=value;}
}
公共信息
{
获取{返回年龄;}
设置{age=value;}
}
公共字符串电子邮件地址
{
获取{返回电子邮件地址;}
设置{emailAddress=value;}
}
公共无效GetAllUser()
{
列表_user=new List();
使用(var\u uow=new UserManagement\u UnitOfWork())
{
_user=(来自_uow.user_Repository.GetAll()中的u)
选择u.ToList();
}
}
}
我是如何把地图放在一起的;参考方法GetAllUser(),我仍然需要使用DAL中的用户模型类,以便从数据库中获取所有用户,这是我目前的理解;每个层应该相互独立,我有抽象层,即数据访问层和业务层之间的存储库。我对这两个概念一起工作有点困惑。我是走对了路还是错过了什么。还需要关于用户业务层的实用答案。您只需使用 通过Nuget安装:
PM> Install-Package AutoMapper
然后,您所要做的就是配置AutoMapper,以便为您映射类似的对象
Mapper.CreateMap<DAL.User, BLL.User>();
Mapper.CreateMap();
可以在任何位置转换对象,如下所示:
BLL.User bll_User = Mapper.Map<DAL.User, BLL.User>(dal_user);
BLL.User BLL\u User=Mapper.Map(dal\u User);
您的问题更多的是关于设计/架构,它没有“一刀切”的解决方案。我最多可以分享一些建议,以及在相当典型的ASP.NET MVC+实体框架堆栈中我通常会做什么:
1.确保您的BLL.User
类遵守
您的BLL.User
类不应该关心如何通过实体框架/工作单元从数据库中检索DAL.User
。您只需要有另一个类/层来负责:
public interface IUserRepository
{
IEnumerable<User> GetAllUsers();
}
这样做将删除从BLL.User
到usermanagement\u UnitOfWork
类的依赖关系,并促进测试/模拟(即可以编写单元测试来模拟内存中的IUserRepository
)
然后,无论何时需要从控制器检索BLL.Users
,只需将IUserRepository
的实例注入控制器的构造函数:
public class UserController
{
private readonly IUserRepository _userRepository;
public UserController(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public ActionResult Index()
{
// Simple example using IEnumerable<BLL.User> as the view model
return View(_userRepository.GetAllUsers().ToList());
}
}
或者,如果你认为编写映射代码是乏味的,考虑使用,这样你的代码就变成了<代码>映射器。 加分
BLL.User
中的private
字段,并将其转换为自动属性ValidationAttribute
派生的属性,以帮助在ASP.NET MVC应用程序中进行验证首先,不需要存储库层和数据访问层。这两个层有着相同的目的——添加一个抽象层来处理持久性存储。尽管他们有不同的概念
GetAll
方法等。这是一个非常简单的描述,但是关于这个模式有足够的资源GetUserByName
、GetUserById
、RemoveUser
、GetAllActiveUsers
等方法GetUserById
方法应该返回一个BLL-User类
,而不是由EF生成的用户类,在这种情况下,该类可以是存储库/DAL层的内部类
为了处理这些类之间的映射,可以使用不同的库,例如或whic
public interface IUserRepository
{
IEnumerable<User> GetAllUsers();
}
public class UserRepository : IUserRepository
{
private readonly UserManagement_UnitOfWork _unitOfWork;
public UserRepository(UserManagement_UnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public IEnumerable<User> GetAllUsers()
{
return from u in _unitOfWork.User_Repository.GetAll()
select u;
}
}
public class UserController
{
private readonly IUserRepository _userRepository;
public UserController(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public ActionResult Index()
{
// Simple example using IEnumerable<BLL.User> as the view model
return View(_userRepository.GetAllUsers().ToList());
}
}
public interface IUserMapper
{
BLL.User MapUser(DAL.User);
}
public class UserMapper : IUserMapper
{
public BLL.User MapUser(DAL.User user)
{
return new BLL.User
{
FirstName = user.FirstName,
LastName = user.LastName,
Age = user.Age
// etc...
};
}
}
public class User
{
public string UserId { get; set; }
[Required]
public string FirstName { get; set; }
public string LastName { get; set; }
[Range(0, int.MaxValue)]
public int Age { get; set; }
[EmailAddress]
public string EmailAddress { get; set; }
}