【问题标题】:Is it possible to use DbContext code to access JSON data from a WebApi?是否可以使用 DbContext 代码从 WebApi 访问 JSON 数据?
【发布时间】:2018-10-25 10:18:34
【问题描述】:

我有一个 ASP.NET Core 2.1 Web 应用程序,它是按照 ASP.NET Core 文档中Create Razor pages web app 中的步骤创建的。一切都按预期进行,我使用了在搭建模型时创建的默认 localdb。那部分很好。

然而,我需要做的是尝试在生产环境中使用相同的通用代码,其中所有 CRUD 功能都是通过调用 WebApi 方法执行的,使用与我的模型对象直接匹配的 JSON 数据。

例如,脚手架为Create创建的Page是这样的:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    _context.Registration.Add(Registration); // Here
    await _context.SaveChangesAsync();       // Here

    return RedirectToPage("./Index");
}

public async Task OnGetAsync()
{
    Registration = await _context.Registration.ToListAsync(); // Here
}

是否有可能,甚至可行,简单地改变每次出现的 _context 操作,比如标记为“//Here”的行,使用对 WebApi 方法的调用?有没有更好的方法来完成我想做的事情?

【问题讨论】:

  • 当然,您是否查看过从 C# 调用 rest api 调用?
  • 是的,当然。我要做的是尽可能多地保留生成的代码,甚至使用 _context 如果我能以某种方式将其更改为使用从 WebApi 返回值读取的数据,而不是连接到实际的并从中读取数据库。
  • 因此,您正在寻找一种调用 WebApi 的便捷方式,而不是使用 DBContext 将数据添加到数据库。如果我真的明白你在问什么,答案不是真的,它们是苹果和橙子(或者我应该说,苹果和保龄球),它们几乎没有相似之处。你将不得不编写 WebRequests 并且你无法摆脱它
  • 我知道我仍然需要调用 WebApi。我希望完成的是尽可能多地维护与 _context 相关的代码。感谢您的帮助!
  • 所以,如果我错了,请纠正我,但我可以通过仅在使用实际数据库在本地运行时调用 Startup 中的 AddDbContext 方法来解决两个非常不同的数据环境的要求(这会导致 DbContext 被注入到基于 PageModel 的类中),而不是在我为我的数据使用 WebApi 调用(并在 PageModels 中使用空 ctor)时调用 AddDbContext。或者,创建我自己的扩展与 ServiceCollection 一起使用,以便将我的自定义数据上下文注入到 PageModels 中?

标签: c# asp.net asp.net-core asp.net-core-webapi dbcontext


【解决方案1】:

您只能使用实体类。但是,您可以将 JSON 转换为您的实体类之一的实例。例如:

using (var response = await _client.GetAsync("/foo/1"))
{
    var foo = await response.ReadAsAsync<Foo>();
    _context.Add(foo);
    await _context.SaveChangesAsync();
}

ReadAsAsync 方法是语法糖,它简单地将响应作为字符串读取,然后将其传递给 JSON.NET 以转换为指定的类型。如果你只有一个 JSON 字符串,你可以使用:

var foo = JsonConvert.DeserializeObject<Foo>(jsonString);

也就是说,这是代码异味。如果您的 API已经与您的实体类交互,那么所有工作都应该在那里完成。如果你想添加一个新实体,你的 API 上应该有一个端点。对于所有其他 CRUD 操作也是如此。让两个不同的应用程序在相同的上下文中工作,而且只是部分地工作,这是灾难的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多