前言:
经过了一个星期的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中的相关的方法就好
到这里结束了,有疑问随时交流哈!