实现服务层与api层共用,也就表明Service层就是api层。
webpai选择控制器的默认实现,可以重写SelectController方法
webapi选择指定控制器下的action的默认实现,可以重写SelectAction方法。
api控制器的基类,继承于此的类都可以成为Api控制器
api注册流程
如果实现Servie层的Controller。
public class ApiService:System.Web.Http.ApiController
{
}
TestServer类代码:
public class TestService:ApiService
{
public string Get()
{
return "Get-Test";
}
}
实现服务类,且具有ApiController的能力
private void Init()
{
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
var ls = assembly.GetTypes().Where(x => typeof(Services.ApiService).IsAssignableFrom(x));
foreach(var item in ls)
{
_apis.Add(item.FullName, item);
}
}
public class CustomSelectController:System.Web.Http.Dispatcher.DefaultHttpControllerSelector
{
public CustomSelectController(System.Web.Http.HttpConfiguration config) : base(config)
{
}
public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
var routeData = request.GetRouteData().Values;
foreach( var route in routeData)
{
if(route.Key == "controller")
{
//找controller
var controllerType = ServicesContainer.CreateInstance().Apis
.Where(x => x.Key.ToLower().IndexOf(route.Value.ToString() + "service") > 0).FirstOrDefault();
if (controllerType.Value!=null)
{
return new DyControllerDescriptor(request.GetConfiguration(), controllerType.Value);
}
}
}
return base.SelectController(request);
}
}
注意:
public class CustomActionActivator:System.Web.Http.Controllers.ApiControllerActionSelector
{
public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
if (!(controllerContext.ControllerDescriptor is DyControllerDescriptor))
{
return base.SelectAction(controllerContext);
}
var realType = controllerContext.ControllerDescriptor as DyControllerDescriptor;
Type[] types = new Type[0];
System.Reflection.MethodInfo methodInfo = realType.ControllerInfo.GetMethod("Get",
types);
return new DyActionDescriptor(controllerContext.Configuration, controllerContext.ControllerDescriptor, methodInfo);
}
}
protected void Application_Start()
{
common.ServicesContainer.CreateInstance();
AreaRegistration.RegisterAllAreas();
//必须放在RouteConfig.RegisterRoutes前面
GlobalConfiguration.Configure((config) =>
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
});
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Dispatcher.IHttpControllerSelector),
new common.CustomSelectController(GlobalConfiguration.Configuration));
GlobalConfiguration.Configuration.Services.Replace(typeof(System.Web.Http.Controllers.IHttpActionSelector), new common.CustomActionActivator());
}