在webApi

时间:2015-05-18 08:52:16

标签: c# asp.net .net asp.net-web-api

我对如何在RESTful web api中为1到1,1对多关系的实体正确加载数据感到困惑,并且想知道人们是否可以提供哪些方法正确的建议以及为什么不应该这样做某些方式。我认为这让我更加困惑,因为我也在尝试创建一个Web应用程序来显示数据,我不想在Web应用程序周围构建web api,我相信很多人都会犯错误。

我们的代码有很多1比1的关系,也有1到1个关系。

例如公司和联系方式。

现在如果我通过webApi加载联系人,目前它会显示一个类似于此的模型

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public long CompanyId { get; set; }
}

这似乎对我来说,如果我想要公司的详细信息,我只会加载公司api的数据。

但是,在我们使用webApi的网络应用程序上,我想在一个页面上显示此记录,我似乎没有权利在我们的Web应用程序中进行2次单独调用以加载所有数据?也许这是因为我习惯于ASP.NET并一次性加载数据?

所以我想要这样的模型吗?

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public CompanyModel Company { get; set; }
}

public class CompanyModel() {
    public long Id { get; set; }

    public string Name { get; set; }
}

现在这很有意义,因为现在我将公司作为模型,我可以向用户显示联系人所属的公司名称,加上我拥有companyId所以我可以使用它,如果我想通过他们到公司屏幕(使用公司ID作为参数)。此外,我现在可以在我的网络应用程序中使用1个web api调用,而不是两个。

但是......当我在页面上显示很多联系人时呢?是的我可以使用上述内容,但如果所有联系人都是针对同一家公司的,那么为每个联系人加载相同的CompanyModel似乎没有意义。也许这样的事情会更好。

public class GetModel() {
    public ICollection<ContactModel> Contacts { get; set; }

    public ICollection<CompanyModel> Companies { get; set; }
}

public class ContactModel() {
    public long Id { get; set; }

    public string Name { get; set; }

    public long CompanyId { get; set; }
}

public class CompanyModel() {
    public long Id { get; set; }

    public string Name { get; set; }
}

现在我可以将所有联系人加载到Contacts集合中,并将任何相关公司加载到Companies集合中。但这完全违反了通过RESTful web api加载数据的规则吗?

关于webApi关系设计的任何指示都会非常感激。

1 个答案:

答案 0 :(得分:0)

我在讨论是否应将此作为评论或答案发布。辩论主要是因为设计是主观的,并且非常依赖于您试图解决的问题。

我的CompanyModel和ContactModel匹配您的第二个实现,尽管第一个/第三个实现在内存方面效率最高。我使用第二个实现只是因为我在MVC页面和WebAPI控制器上共享我的模型。让CompanyModel在那里允许我在编写Razor时访问公司信息。但是如果你不写Razor(或者像我一样意识到你更喜欢使用像AngularJS或JSViews这样的Javascript MVC / MVVM框架),那么在第一个/第三个实现中编写它是最有意义的。对我来说,第二个实现允许我在需要时加载CompanyModel,并在不需要时保持null。 (仅仅因为我的编码风格已经改变,我没有理由不重构代码。)