我正在研究 MVC 框架(ASP.NET MVC5、Entity Framework 6)中的 e-tier 架构。我的应用程序分为三个子项目,即业务层、数据访问层、存储库(包括存储库和工作单元)和 ASP.NET MVC 网络应用程序。我正在努力理解业务数据和 Entity Framework 模型之间的映射。例如,如果我在 Entity Framework 中有模型类 User 作为
DAL - 用户模型
[Table("User")]
public class User
{
public User() { }
[Key]
public int UserID { get; set; }
[StringLength(250)]
[Required]
public string FirstName { get; set; }
[StringLength(250)]
[Required]
public string LastName { get; set; }
[Required]
public int Age { get; set; }
[StringLength(250)]
[Required]
public string EmailAddress { get; set; }
public ICollection<UserInGroup> UserInGroup { get; set; }
}
在业务层我有用户类
BLL - 用户类
public class User
{
private string userID;
private string firstName;
private string lastName;
private int age;
private string emailAddress;
public string UserID
{
get { return userID; }
set { userID = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
public string EmailAddress
{
get { return emailAddress; }
set { emailAddress = value; }
}
public void GetAllUser()
{
List<App.DAL.Model.User> _user = new List<DAL.Model.User>();
using (var _uow = new UserManagement_UnitOfWork())
{
_user = (from u in _uow.User_Repository.GetAll()
select u).ToList();
}
}
}
我如何映射在一起,其次;引用方法 GetAllUser(),我仍然需要使用 DAL 中的用户模型类,以便从数据库中获取所有用户,我目前的理解是;每个层应该相互独立,我有抽象层,即数据访问层和业务层之间的存储库。我对这两个概念一起工作有点困惑。我是在正确的轨道上还是遗漏了什么。还需要用户业务层的实际答案。
最佳答案
您的问题更多是关于设计/架构的,它没有“一刀切”的解决方案。我最多可以分享一些建议,以及在相当典型的 ASP.NET MVC + Entity Framework 堆栈中我通常会做什么:
1。确保您的 BLL.User
类遵守 Single Responsibility Principle
你的 BLL.User
类不应该关心如何检索 DAL.User
从数据库通过 Entity Framework /工作单元。您应该只需要另一个类/层来负责:
public interface IUserRepository
{
IEnumerable<User> GetAllUsers();
}
然后另一个类来实现IUserRepository
:
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;
}
}
这样做会从您的 BLL.User
中删除依赖项到 UserManagment_UnitOfWork
类并促进测试/模拟(即可以编写单元测试来模拟内存中的 IUserRepository
)
然后从你的 Controller ,无论何时需要检索 BLL.Users
, 你只需注入(inject)一个 IUserRepository
的实例到 Controller 的构造函数:
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());
}
}
2。如何映射DAL.User
至 BLL.User
它实际上与第 1 点非常相似,您可以简单地拥有另一个接口(interface)/类对:
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...
};
}
}
或者,如果您认为编写映射代码很乏味,请考虑使用 AutoMapper这样你的代码就变成了Mapper.Map<DAL.User, BLL.User>(user)
奖励积分
- 你可以跳过那些
private
BLL.User
中的字段并将它们转换为自动属性 - 您可以添加源自
ValidationAttribute
的属性帮助验证您的 ASP.NET MVC 应用程序
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; }
}
关于c# - 如何在 n 层架构中将 Entity Framework 模型类映射到业务层类 - ASP.NET-MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30319584/