ASP.net MVC+EF 架构新的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jerry11112/article/details/88092611

前言:

经过了一个星期的MVC+EF 学习,对此有了进一步的认识与理解,上篇博客已经很清晰的讲解了EF的原理,以及它的一个简单的搭建过程,本博客只是想单单的谈谈架构!

没有最坏的架构,也没有最好的架构,只有最合适的架构!

首先看一下我的架构图:
在这里插入图片描述
现在简单的解释一下上图:首先我们的MVC就是U层!EF因为是要与数据库打交道的,所以它应该放在d层,但是如果放在d层,我们此时就少了一个在各个层之间传输数据的model,图中的DTO解决了此问题,现在它就是model!至于Service层,之所以改了一个名字是因为我们将ef放到里面了,此时这里还进行了数据的操作(增删改查)以及一些实体的配置!这时候有人会问,BLL层哪里去了,这里我没有加,因为之前的项目B层就是一个转发数据的过程,如果你的项目要是大,那就把B层加上就好了!

这个DTO一般都是“扁平类” ,就是说我的属性都是我自己的!没有关联属性!

架构代码:

根据上面的图,我们很轻松的可以看出各个层的引用关系,这里我就不多说了!看下图:我们的Schoolservicel里有MinZu,Student,Class三个实体,并且对应各个实体与数据库映射的配置,都在EntityConfig下!
在这里插入图片描述
这里只是单单展示student

Service层

1、学生实体类

	namespace EFEntities
{
public class Student : BaseEntity
 {
    public string Name { get; set; }
    public int Age { get; set; }

    public long ClassId { get; set; }

    public Class Class { get; set; }

    public long MinZuId { get; set; }

    public MinZu Minzu  { get; set; }                   
}
}

2、配置类

using System.Data.Entity.ModelConfiguration;

namespace EFEntities.EntityConfig
{
    public class StudentConfig:EntityTypeConfiguration<Student>
    {
        public StudentConfig()
        {   
            ToTable("T_Students");
            Property(e => e.Name).HasMaxLength(20).IsRequired();
            Property(e => e.Age).IsRequired();
            HasRequired(e => e.Class).WithMany().HasForeignKey(e => e.ClassId);//一对多的对应功能

            HasRequired(e => e.Minzu).WithMany().HasForeignKey(e => e.MinZuId);
        }
    }
}


3、Mycontext类

 public class Mycontext : DbContext
    {
        public Mycontext() : base("name=ConnStr")
        {
        } 

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Class> Classes { get; set; }
        public DbSet<MinZu>MinZus  { get; set; }

    }

4、StudentService类

using EFEntities;
using SchoolDTO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;

namespace SchoolService
{
    public class StudentService
    {
        public void AddNew(string name, int age, long minzuId, long classId)
        {
            using (Mycontext ctx = new Mycontext())
            {
                Student s = new Student();
                s.Age = age;
                s.ClassId = classId;
                s.MinZuId = minzuId;
                s.Name = name;
                ctx.Students.Add(s);
                ctx.SaveChanges();
            }
        }
     }
}        

以上是学生在service层的代码

DTO层

namespace SchoolDTO
{
    public class StudentDTO
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public long MinZuId { get; set; }
        public string MinZuName { get; set; }  //扁了 不用minzu.minzuname
        public long ClassId { get; set; }
        public string ClassName { get; set; }
    }
}

StudentDTO就相当与一个存储数据的model,供其它层调用,DTO保证了,返回的对象一定是普通的对象,而不是和EF关联的对象,此时我们对DTO做任何的操作也不会影响数据库,避免了层之间的耦合!

Web

这里没有BLL层,所以它直接调取Service中的相关的方法就好

到这里结束了,有疑问随时交流哈!

猜你喜欢

转载自blog.csdn.net/jerry11112/article/details/88092611