Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在n层体系结构中映射实体框架模型类和业务层类-ASP.NET-MVC_C#_Asp.net Mvc_Asp.net Mvc 5_Repository Pattern_N Tier Architecture - Fatal编程技术网

C# 如何在n层体系结构中映射实体框架模型类和业务层类-ASP.NET-MVC

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;

我正在MVC框架(ASP.NETMVC5,EntityFramework6)中研究电子层体系结构。我的应用程序分为三个子项目,分别是业务层、数据访问层、存储库(包括存储库和工作单元)和ASP.NET MVC web app。我正在努力理解业务数据和实体框架模型之间的映射。例如,如果实体框架中的模型类User为

DAL用户模型
[表(“用户”)]
公共类用户
{
公共用户(){}
[关键]
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应用程序中进行验证

  • 首先,不需要存储库层和数据访问层。这两个层有着相同的目的——添加一个抽象层来处理持久性存储。尽管他们有不同的概念

  • 存储库模式基本上为您提供了一种处理数据库的方法,就像它是内存中的集合一样。大多数情况下,它公开了基本的CRUD(create-read-update和delete)方法和一些其他扩展,如
    GetAll
    方法等。这是一个非常简单的描述,但是关于这个模式有足够的资源
  • 数据访问层也增加了一个抽象,但以更加主观的方式。基本上,它包含了访问数据库的所有API。例如,对于您的用户类,它可以具有诸如
    GetUserByName
    GetUserById
    RemoveUser
    GetAllActiveUsers
    等方法
  • 此外,工作单元不必在存储库/DAL中实现。因为单个工作单元可以包含对多个实体的修改或对外部服务的请求。我认为BLL更适合UoW,因为在大多数情况下,您可以将单个业务操作(BL中的方法)视为UoW

    现在,当这是一个更清楚(希望)。您的Repository/DAL应该只返回业务实体,而不是数据库生成的类(如果它们不同),并且所有映射逻辑都应该封装在Repository/DAL层中。例如,
    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; }
    }