在ASP.NET MVC 4应用程序中,我应该考虑哪些控件的可扩展性

时间:2014-01-09 15:00:28

标签: vb.net asp.net-mvc-4

我正在使用System.Web.Mvc.Controller用于UI,System.Web.Http.ApiController用于API,用于为大型ERP应用程序创建Web界面原型。我已经找到了一种方法,可以通过问题Deploying un-compiled ASP.NET MVC Razor application使UI具有一定的可扩展性。现在我想知道,由于ApiController的严格性,如果有其他类我应该考虑提供一个开放式接口来定义自定义API事务。或者是否有某种方法可以以更开放的方式使用ApiController,其中参数计数和类型可能会有所不同......也许是通过接受对象参数?

2 个答案:

答案 0 :(得分:0)

对于Web API,您可以尝试使用IHttpActionSelector interface:

实现自定义操作选择器
public class CustomActionSelector : IHttpActionSelector
{
    public override HttpActionDescriptor SelectAction(HttpControllerContext context)
    {
        var method = GetMethod(context);
        return new ReflectedHttpActionDescriptor(GetController(method), method);
    }

    private MethodInfo GetMethod(HttpControllerContext context)
    {
        // Locate the target method using the extensibility framework of your choice 
        // (for example, MEF, pure reflection, etc.)
    }    

    private HttpControllerDescriptor GetController(MethodInfo method)
    {
        return new HttpControllerDescriptor() 
        {
            ControllerName = method.DeclaringType.Name, 
            ControllerType = method.DeclaringType
        };
    }
}

要注册新的操作选择器,请将以下内容放在global.asax下的Application_Start文件中:

var config = GlobalConfiguration.Configuration;
config.Services.Replace(typeof(IHttpActionSelector), new CustomActionSelector());

希望这有帮助。

答案 1 :(得分:0)

使ASP.NET Web应用程序可扩展非常简单,因为ASP.NET在bin目录中搜索所有程序集中的控制器类。因此,如果提供自定义的一方可以简单地将其代码编译到DLL中并将其放入bin目录中,那么您的Web应用程序将从标准交付中获取所有控制器以及控制器。作为示例,我在引用System.Web.HttpSystem.Web.Mvc的独立DLL中创建了以下类:

Public Class CustomTestController
   Inherits ApiController

   Public Function GetValues() As IEnumerable(Of String)
      Return New String() {"value1", "value2"}
   End Function

End Class

我只是编译它并将其复制到部署我的Web应用程序的位置的bin目录,然后我可以访问http://localhost/MyApplication/api/CustomTest/并返回value1value2预期的回应。