下面我们来看第二层:Data 这一层相对来说是对Core层的具体实现了.
从命名可以看出来,这和数据库相关.
1.Db.cs
CodeFirst模式的本地数据库类,继承了DbContext.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Dinner>().HasMany(r => r.Meals).WithMany(o => o.Dinners).Map(f => { f.MapLeftKey("DinnerId"); f.MapRightKey("MealId"); }); modelBuilder.Entity<User>().HasMany(r => r.Roles).WithMany(o => o.Users).Map(f => { f.MapLeftKey("UserId"); f.MapRightKey("RoleId"); }); base.OnModelCreating(modelBuilder); }
这个重写方法的用处就是,建立表的映射关系和外键引用关系.
2.DbContextFactory.cs
public class DbContextFactory : IDbContextFactory { private readonly DbContext dbContext; public DbContextFactory() { dbContext = new Db(); } public DbContext GetContext() { return dbContext; } } public interface IDbContextFactory { DbContext GetContext(); }
在使用EF框架的时候,DbContext实例化必须要保持唯一性,针对于应用程序多层设计,在技术每一层或多个方法调用的时候, 我们使用的这个数据实体上下文必须要唯一。
所以这里使用的是静态的变量和静态只读的构造函数保持唯一.
3.DelRepo.cs
4.Repo.cs
5.UniRepo.cs
三个类通过List<T>具体实现了Core层的三个抽象接口类,T就是在具体使用的时候运用的类型了.
下面我们来看第三层:Infra 这层为实现抽象层和后续的业务实现层建立了桥梁
ProDinner使用了Castle.Windsor开源项目,最直接最根本的使用了依赖倒转,说得通俗点,就是不用new任何对象, 接口调用接口来实现具体操作.Infra层其实就是运用了Castle的这种特定的方式实现了依赖倒转。
public static class IoC { private static readonly IWindsorContainer TheContainer = new WindsorContainer(); //声明一个唯一的依赖倒转容器 public static IWindsorContainer Container { get { return TheContainer; } } public static T Resolve<T>() { return TheContainer.Resolve<T>(); } public static object Resolve(Type type) //Resolve就是为实现不同的类型容器的接口 { return TheContainer.Resolve(type); } }