c# - 如何在 n 层架构中将 Entity Framework 模型类映射到业务层类 - ASP.NET-MVC

标签 c# asp.net-mvc asp.net-mvc-5 repository-pattern n-tier-architecture

我正在研究 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.UserBLL.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)

奖励积分

  1. 你可以跳过那些 private BLL.User 中的字段并将它们转换为自动属性
  2. 您可以添加源自 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/

相关文章:

javascript - 返回 View MVC/Javascript/.NET Core 时出现问题

asp.net-mvc - DropDownListFor 带有自定义构建列表

asp.net - linq 求和与分组

ASP.NET MVC 身份数据库

c# - MVC 5 重定向到登录页面不适用于 OWIN

c# - 保护只有一个用户的高值(value) C# 应用程序

c# - 实例为null后如何访问Instance方法delegate

c# - 在 C# 中反格式化货币

javascript - Knockout 未绑定(bind)到模型的问题

asp.net-mvc - ASP.NET MVC 内置对 DropDownList 编辑器模板的支持