对于.net 项目, 大部分会选择使用Reposiotry的方式来设计数据层,这里只是介绍一些很基础的设计。
第一步,建立工程,使用Vs2019建立一个 ASP.NET core web application 工程。这里新的web工程先不做任何动作,之后会进行一些改动。
第二步,在解决方案中建立一个Class Library(.net Core),我的取名是“工程名.Entities”,然后需要在Nuget中安装 Microsoft.EntityFrameworkCore。接下来,创建名为“Models” 的文件夹,这个文件中所存放的是类文件,类文件的数量和数据库中表的数量一致,并且字段也和数据库中的一样。然后在根目录下创建一个“RepositoryContext.cs”的文件。这个文件继承DBcontext类(该类在Microsoft.EntityFrameworkCore中)。 在构造函数中键入 DbContextOptions 类型的参数,然后使用 ":base(DbContextOptions类型参数)"。创建DbSet<类文件夹中每个类名>的变量(public), 例如:public DbSet<User> Users{get; set;},这里建议将变量名使用复数。
第三步,返回第一步中建立的web application 工程。 在 appsettings.json中加入节点 “sqlconnection”:{"connectionString": "链接字符串"}。这里“sqlconnection” and "connectionString" 可以自定义名字,我写这两个只是个人习惯。然后建立一个名为“Extension”的文件夹,并且建立一个“ServiceExtension”类 注:static 类。紧接着在这个类中创建一个 “ConfigureSQLContext” 方法,包含“this IServiceCollection” 和 “IConfiguration” 两个类型的参数。这两个参数类型需要导入:Microsoft.Extensions.Configuration 和 Microsoft.Extensions.DependencyInjection。在方法中键入 services.AddDbContext<RepositoryContext>(o => o.UseSqlServer(config["sqlconnection:connectionString"])); 这里 “UseSqlServer”需要引入Microsoft.EntityFrameworkCore。完成这些步骤后,打开“Startup”文件,找到“ConfigureServices” 方法这里需要加载工程需要所有的service。所以刚才创建的“ConfigureSQLContext”也需要加载进去。在这里 已经有一个名为“services” 的参数,你可以使用“services”加“.” 找到刚才创建的方法。如果没有,然后ServiceExtension,检查类和方法是否为static,然后 IServiceCollection 类型参数前是否加“this”。如果上述都已经检查无误。就可以通过services加“.”找到该方法。然后将 Configuration 传入ConfigureSQLContext方法中。 完成后的应为是:“ services.ConfigureSQLContext(Configuration)”;
第四步,创建另一个Class Library(.net Core) 工程 名为“工程名.Abstract”这里存放所有的接口。引用之前创建的 “Entities” 的工程。然后创建一个接口“IRepositoryBase” 泛类型接口。
我创建的代码如下:
public interface IRepositoryBase<T> { void Created(T entity); IQueryable<T> ReadAll(); IQueryable<T> ReadByFilter(Expression<Func<T, bool>> expression); void Update(T entity); void Delete(T entity); }
第五步,创建新的Class Library(.net Core) 工程 名为“工程名.Repository”,引用“abstract 和 entities” 两个工程。然后创建一个名为 RepositoryBase的抽象类。实现“IRepositoryBase”接口,并且在构造函数中加入“RepositoryContext”(在第二步中创建的类)类型的参数。
代码如下:
public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class { private readonly RepositoryContext _repositoryContext; public RepositoryBase(RepositoryContext repositoryContext) { _repositoryContext = repositoryContext; } public void Created(T entity) { _repositoryContext.Set<T>().Add(entity); } public IQueryable<T> ReadAll() { return _repositoryContext.Set<T>().AsNoTracking(); } public IQueryable<T> ReadByFilter(Expression<Func<T, bool>> expression) { return _repositoryContext.Set<T>().Where(expression).AsNoTracking(); } public void Update(T entity) { _repositoryContext.Set<T>().Update(entity); } public void Delete(T entity) { _repositoryContext.Set<T>().Remove(entity); } }
至此,最最基本的Repository 结构就完成。下次我会介绍如果使用它。
在这里有一个小建议:就是在创建 IRepositoryBase 和 实现接口的RepositoryBase 中方法的顺序尽量 遵循 'CRUD' 即 Create, Read, Update 和 Delete的顺序。然后类里的顺序是:私有变量,构造函数,共有变量,私有方法,共有方法的顺序去排列,这个是个人的习惯。