视图模型带*和*没有ID?

时间:2015-03-19 09:34:23

标签: c# rest asp.net-web-api viewmodel objectid

在典型的RESTful应用程序中,对象querycreate不包含ID,而updatequery result - 包含ID。为这些操作构建模型存在设计困境:

  • 创建不带ID的模型,并将ID作为附加参数传递。这并不能解释索引列表的序列化。
  • 使用ID创建模型,并且仅依靠维护人员将其连接到不应该的位置。发现安全漏洞是该方案的一个挑战,模型验证很棘手。
  • 创建带有和不带ID的模型(可能带有派生)。虽然spaghetti viewmodels ...
  • IncludesId<TObject,TId>(可能派生DictionaryKeyValuePair)类和自定义序列化添加到项目中。这可能与资源定位器很好地配对。我还没有给出足够的想法,只是到达这里......

如何处理视图模型上的ID以解决这种双重需求?

我包含了我通常在标签中使用的环境,但我认为这个问题确实非常特定于该环境。对不起,这个问题有点开放。只是在这段时间之后,我仍然没有任何练习来管理这种感觉干净,所以我对这些想法持开放态度。

示例(按要求)

public class AccountController : _ApiController {

    // returns but does not consume Id, dead member to confuse maintainers
    public IEnumerable<AccountViewModel> GetBestMatches(AccountViewModel searchCriteria) { ... }

    // returns Id, but consuming Id adds risk of updating another account
    public AccountViewModel PostRegisterUser(AccountViewModel newAccount) { ... }

    // consumes Id, returning Id is typically unimportant
    [Require(Privilege.AccountEdit)]
    public AccountViewModel PutEditUser(AccountViewModel editedAccount) { ... }

    // Id is derived from current authentication, presence adds maintenance risk
    public AccountViewModel PostEditOwnProfile(AccountViewModel selfAccount) { ... }

    // should not expose/return Id
    [Route("api/Appointment/{appointmentId}/ClientContactInfo")]
    public AccountViewModel GetContactInformation(int appointmentId) { ... }

}

在上面的例子中,使用的技术是AngularJS - &gt; JSON - &gt; ASP.NET WebAPI2 - &gt; C# - &gt; EntityFramework 6 - &gt; SQL Server 2012

0 个答案:

没有答案