NoSQL于Apworks数据服务中应用基于Entity Framework Core的囤积(Repository)实现

《以ASP.NET
Core中使用Apworks快速开数据服务》一中和遭遇,我介绍了怎样使用Apworks框架的数据服务来快速构建用于查询及管制数据模型的RESTful
API,通过该文的牵线,你晤面看,使用Apworks框架开发数据服务是哪简单快速,提供的作用吗异常多,比如对准Hypermedia的支持,以及提供丰富的好信息以及调用栈信息。另外,Apworks数据服务可以支撑各种类型的仓储(Repository)实现,在该文的案例被,我动用了MongoDB作为仓储的落实,这是为快速方便地示范数据服务的搭建过程。如果您所运用的凡关系项目数据库,也尚无关联(意思是没什么,不是说数目没有干。。。-_-!!!),基于Entity
Framework Core的存储实现能够满足你的急需。

需要注意的一个题目

于此前总版本的Apworks备受,仓储的接口是支撑饥饿加载的,也就是说,在缓加载被启用的时光,仓储允许通过显式指定同多级的目标属性,当主对象吃归时,这些性所针对的子对象也会又返回。这样的规划以当下底状况下是有理之,因为是否需要加载某些性能是得当次中指定的,对于类似MongoDB的储存实现,它没有延迟加载的概念,因此得以忽略这个参数。在Apworks数据服务中,由于仓储的操作会直接为DataServiceController调用,而有关的查询条件都是根源于RESTful
API的,因此,很为难在API的圈来规定某些聚合的目标属性是否要饥饿加载(Eager
Loading)。另一方面,禁用延迟加载又会起性能问题,因此,在脚下本的贯彻着,我还从未考虑好用何种方法来解决这个题材。或许可以经HTTP
Header来指定要饥饿加载的特性路径,但随即是任何一个题材。总之,在连下去的案例被,你以张,虽然数额已添加成功,但当返回的结果里,被集的分支对象将无法回到。我会设法解决此题材。

案例:Customer Service

假如我们得采取Entity
Framework快速构建一个支持增删改查操作的数据服务(Data
Service),并期望该服务能以容器被运行,我们得以率先新建一个ASP.NET
Core的应用程序,然后按照下面的步骤进行:

  1. 向阳ASP.NET Core应用程序添加以下NuGet包引用:

  2. Apworks.Integration.AspNetCore

  3. Apworks.Repositories.EntityFramework
  4. Microsoft.EntityFrameworkCore.SqlServer(在该案例被我们利用SQL
    Server,当然为足以使PostgreSQL或者MySQL等)
  5. Microsoft.EntityFrameworkCore.Tools

新建世界模型,向ASP.NET Core应用程序中添加Customer和Address类:

public class Address
{
    public Guid Id { get; set; }

    public string Country { get; set; }

    public string State { get; set; }

    public string City { get; set; }

    public string Street { get; set; }

    public string ZipCode { get; set; }
}

public class Customer : IAggregateRoot<Guid>
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Email { get; set; }

    public Address ContactAddress { get; set; }
}

新建一个DbContext类,用于指定数据库的访方式,以及针对性范对象/数据表结构进行映射:

public class CustomerDbContext : DbContext
{
    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Customer>()
            .ToTable("Customers")
            .HasKey(x => x.Id);
        modelBuilder.Entity<Customer>()
            .Property(x => x.Id)
            .ForSqlServerHasDefaultValueSql("newid()");
        modelBuilder.Entity<Customer>()
            .Property(x => x.Name)
            .IsUnicode()
            .IsRequired()
            .HasMaxLength(20);
        modelBuilder.Entity<Customer>()
            .Property(x => x.Email)
            .IsUnicode()
            .IsRequired()
            .HasMaxLength(50);
        modelBuilder.Entity<Address>()
            .ToTable("Addresses")
            .HasKey(x => x.Id);
        modelBuilder.Entity<Address>()
            .Property(x => x.Id)
            .ForSqlServerHasDefaultValueSql("newid()");

        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=localhost\sqlexpress; Database=CustomerService; Integrated Security=SSPI;");
    }
}

开拓Package Manager Console,并于缓解方案资源管理器中将当前ASP.NET
Core项目安装为启动项目(注意:这同样点很关键)。然后挨家挨户执行:

Add-Migration InitialCreate
Update-Database

事业有成做到就同步骤后,我们的数据库就都准备好了。事实上,以上步骤都是开一个Entity
Framework
Core应用程序所不可不经历之正统步骤,目前还尚未以Apworks的效力(当然,将Customer定义成聚合根除外)。接下来,我们开始实现并配置Apworks数据服务,接下的手续同基于MongoDB的实现充分类似。

于ASP.NET
Core应用程序的Controllers文件夹下,新建一个CustomersController,从DataServiceController继承:

public class CustomersController : DataServiceController<Guid, Customer>
{
    public CustomersController(IRepositoryContext repositoryContext) : base(repositoryContext)
    {
    }
}

开辟Startup.cs文件,分别修改ConfigureServices和Configure方法,如下:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();
    services.AddScoped<CustomerDbContext>();
    services.AddApworks()
        .WithDataServiceSupport(new DataServiceConfigurationOptions(sp =>
            new EntityFrameworkRepositoryContext(sp.GetService<CustomerDbContext>())))
        .Configure();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    app.EnrichDataServiceExceptionResponse();

    app.UseMvc();
}

和MongoDB实现不同的是,在用EntityFrameworkRepositoryContext之前,我们用通过services.AddScoped方法,将CustomerDbContext以Scoped生命周期注册及IoC容器中,而以初始化EntityFrameworkRepositoryContext时,使用Service
Provider的GetService方法进行Resolve,这样就能确保每次HTTP请求完成时,资源都能够不负众望释放。

下面,我们来测试一下以此Apworks数据服务。在Visual Studio
2017遭到本下Ctrl+F5,直接运行ASP.NET
Core应用程序,使用你爱的RESTful客户端软件,向/api/Customers进行POST操作,可以望,Customer可以被成功创办,Customer
Id即刻返回:

NoSQL 1

给我们重GET一下试(注意:返回的ContactAddress是null,而事实上数据库里是有值的。这里归nullNoSQL的原由是盖咱们没有于Entity
Framework中经Include调用进行饥饿加载(Eager
Loading),接下会尝试解决是题材):

NoSQL 2

除去ContactAddress在GET请求被归吗null之外,其它各种表现,包括数据服务所支撑之API接口、调用方式相当,都同前MongoDB的兑现完全相同。

源代码

本文案例被的源代码可以以Apworks
Examples开源项目受到找到。本案例的源代码在Apworks.Examples.CustomerService.EntityFramework目录下。

总结

本文带领正大家齐声预览了Apworks数据服务对Entity Framework
Core的支持,使得Apworks数据服务不仅可以动用MongoDB等NoSQL存储方案,也得以用关系项目数据库存储方案,而且编程体验吧是几一样之。这对于不同应用场景下微服务之落实是甚有辅助的。虽然在Entity
Framework Core的实现中,目前小欠缺,但我会尽快缓解此问题。

网站地图xml地图