对多个表使用相同的 Class 作为控制器

Use Same Class as Controller for Many Tables

我是 asp.net 和 Azure 移动服务的新手。

有一些问题:

1)我已经使用 TodoItemController 从 azure table 存储中查询数据 (只是使用了他们的示例 class,如下所示) 我如何修改它以便它作为通用 Class 用于所有 Table 而不仅仅是一个 table.for eg:if 我有另一个 Table 叫人分开来自东都 我希望它对 tables

使用相同的 class

2)我建议的方法是否是一个糟糕的设计模式?如果是,为什么?

3) 我也不知道这个 class 是如何被调用的。 在某处看到../tables/Todo 映射到这个 class.if 那就是 case.Where 映射完成了吗?

4)ApiController 会实现我的目的 1 吗?如果请举个例子

using System.Linq;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Http.OData;
using Microsoft.WindowsAzure.Mobile.Service;
using TempService.DataObjects;
using TempService.Models;
using System.Web.Http.OData.Query;
using System.Collections.Generic;

namespace TempService.Controllers
{
public class TodoItemController : TableController<TodoItem>
{

    protected override void Initialize(HttpControllerContext controllerContext)
    {
        base.Initialize(controllerContext);

        // Create a new Azure Storage domain manager using the stored 
        // connection string and the name of the table exposed by the controller.
        string connectionStringName = "StorageConnectionString";
        var tableName = controllerContext.ControllerDescriptor.ControllerName.ToLowerInvariant();
        DomainManager = new StorageDomainManager<TodoItem>(connectionStringName,
            tableName, Request, Services);
    }

    public Task<IEnumerable<TodoItem>> GetAllTodoItems(ODataQueryOptions options)
    {
        // Call QueryAsync, passing the supplied query options.
        return DomainManager.QueryAsync(options);
    }

    // GET tables/TodoItem/1777
    public SingleResult<TodoItem> GetTodoItem(string id)
    {
        return Lookup(id);
    }

    // PATCH tables/TodoItem/1456
    public Task<TodoItem> PatchTodoItem(string id, Delta<TodoItem> patch)
    {
        return UpdateAsync(id, patch);
    }

    // POST tables/TodoItem
    public async Task<IHttpActionResult> PostTodoItem(TodoItem item)
    {
        TodoItem current = await InsertAsync(item);
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }

    // DELETE tables/TodoItem/1234
    public Task DeleteTodoItem(string id)
    {
        return DeleteAsync(id);
    }
}

}

所以我会尽量逐点回答你的问题:

  1. 是也不是。您要做的是遵循存储库模式。所以是的,您可以创建一个 BaseRepository 来完成大部分使用通用数据类型的工作。不,您仍然会有 类 继承基础但指定通用数据类型。

  2. 不,这不是一个糟糕的设计模式。

  3. 所以 TableController 是一个专门用于数据的 ApiController table。它是通过翻译 URL “/tables/TodoItem/Id”

  4. 的路由配置调用的
  5. 同样,TableController 是一个 ApiController。不确定它是否有帮助,但有许多 "Repository Pattern" 的 Azure 移动服务示例。你可以看看这里得到一个想法: http://www.codeproject.com/Articles/574357/Repository-Pattern-with-Windows-Azure-Mobile-Servi