2

是否有可能由同一个控制器(例如 AnimalsController)处理不同的实体集(例如 Cats 和 Dogs)?

public class AnimalsController : EntitySetController<Animal, int>
{
}

...

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Animal>("Cats");
modelBuilder.EntitySet<Animal>("Dogs");

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);

基本上我需要能够声明两个不同的路由(/odata/cats 和 /odata/dogs),它们将到达同一个控制器。

一旦进入控制器,我将需要一种方法来检索路由上下文以确定该方法是否会返回猫或狗。

谁能指出我实现这一结果的正确方向?

4

1 回答 1

4

我通常建议您为每个要公开的实体集使用一个 Web API 控制器。但是如果你真的必须将请求映射到同一个控制器,我会这样做。定义以下控制器选择器:

public class AnimalControllerSelector : DefaultHttpControllerSelector
{
    public override string GetControllerName(HttpRequestMessage request)
    {
        string controllerName = base.GetControllerName(request);
        if (controllerName == "Cats" || controllerName == "Dogs")
        {
            controllerName = "Animals";
        }
        return controllerName;
    }
}

注册它:

config.Services.Replace(typeof(IHttpControllerSelector), new AnimalControllerSelector());

然后使用以下代码访问控制器中的实体集名称:

string entitySetName = (ODataPath.Segments.First() as EntitySetPathSegment).EntitySetName;

希望有帮助。

于 2013-02-19T19:31:29.760 回答