This commit is contained in:
parent
38821ed87a
commit
da759df8a6
|
@ -0,0 +1,27 @@
|
||||||
|
using Dipper.Alioth.Web;
|
||||||
|
|
||||||
|
namespace Dipper.Alioth.Extensions;
|
||||||
|
|
||||||
|
public static class StartHostExtension
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 添加监听服务文件夹组件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="host"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static StarHost AddWatchServiceFolder(this StarHost host, string path)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
{
|
||||||
|
throw new DirectoryNotFoundException(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 这块地方应当是另一个类的
|
||||||
|
// 且该类应当依赖注入(单例注入)至Host主机中
|
||||||
|
var watcher = new FileSystemWatcher(path);
|
||||||
|
watcher.EnableRaisingEvents = true;
|
||||||
|
|
||||||
|
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ActionConstraints;
|
||||||
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
using Microsoft.AspNetCore.Mvc.ApplicationModels;
|
||||||
|
|
||||||
namespace Dipper.Alioth.Web;
|
namespace Dipper.Alioth.Web;
|
||||||
|
@ -6,6 +9,134 @@ public class ServiceConvention : IApplicationModelConvention
|
||||||
{
|
{
|
||||||
public void Apply(ApplicationModel application)
|
public void Apply(ApplicationModel application)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
foreach (var controller in application.Controllers)
|
||||||
|
{
|
||||||
|
var type = controller.ControllerType;
|
||||||
|
if (typeof(IService).IsAssignableFrom(type))
|
||||||
|
{
|
||||||
|
ConfigureServiceExplorer(controller);
|
||||||
|
ConfigureSelector(controller);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ConfigureServiceExplorer(ControllerModel controller)
|
||||||
|
{
|
||||||
|
controller.ApiExplorer.IsVisible ??= true;
|
||||||
|
|
||||||
|
foreach (var action in controller.Actions)
|
||||||
|
{
|
||||||
|
action.ApiExplorer.IsVisible ??= true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConfigureSelector(ControllerModel controller)
|
||||||
|
{
|
||||||
|
RemoveEmptySelectors(controller.Selectors);
|
||||||
|
|
||||||
|
if (controller.Selectors.Any(selector => selector.AttributeRouteModel != null))
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var action in controller.Actions)
|
||||||
|
{
|
||||||
|
ConfigureSelector(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RemoveEmptySelectors(IList<SelectorModel> selectors)
|
||||||
|
{
|
||||||
|
for (var i = selectors.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
var selector = selectors[i];
|
||||||
|
if (selector.AttributeRouteModel == null &&
|
||||||
|
selector.ActionConstraints.Count <= 0 &&
|
||||||
|
selector.EndpointMetadata.Count <= 0)
|
||||||
|
{
|
||||||
|
selectors.Remove(selector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ConfigureSelector(ActionModel action)
|
||||||
|
{
|
||||||
|
RemoveEmptySelectors(action.Selectors);
|
||||||
|
|
||||||
|
if (action.Selectors.Count <= 0)
|
||||||
|
AddServiceSelector(action);
|
||||||
|
else
|
||||||
|
NormalizeSelectorRoutes(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddServiceSelector(ActionModel action)
|
||||||
|
{
|
||||||
|
var template = new Microsoft.AspNetCore.Mvc.RouteAttribute(GetRouteTemplate(action));
|
||||||
|
var selector = new SelectorModel
|
||||||
|
{
|
||||||
|
AttributeRouteModel = new AttributeRouteModel(template)
|
||||||
|
};
|
||||||
|
selector.ActionConstraints.Add(new HttpMethodActionConstraint(new[] { GetHttpMethod(action) }));
|
||||||
|
action.Selectors.Add(selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void NormalizeSelectorRoutes(ActionModel action)
|
||||||
|
{
|
||||||
|
foreach (var selector in action.Selectors)
|
||||||
|
{
|
||||||
|
if (selector.AttributeRouteModel == null)
|
||||||
|
{
|
||||||
|
var template = new Microsoft.AspNetCore.Mvc.RouteAttribute(GetRouteTemplate(action));
|
||||||
|
selector.AttributeRouteModel = new AttributeRouteModel(template);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selector.ActionConstraints.OfType<HttpMethodActionConstraint>().FirstOrDefault()?.HttpMethods?.FirstOrDefault() == null)
|
||||||
|
selector.ActionConstraints.Add(new HttpMethodActionConstraint(new[] { GetHttpMethod(action) }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetRouteTemplate(ActionModel action)
|
||||||
|
{
|
||||||
|
if (action.Attributes is { Count: > 0})
|
||||||
|
{
|
||||||
|
foreach (var item in action.Attributes)
|
||||||
|
{
|
||||||
|
if (item is RouteAttribute attribute)
|
||||||
|
{
|
||||||
|
// attribute.Path
|
||||||
|
return attribute.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var routeTemplate = new StringBuilder();
|
||||||
|
//routeTemplate.Append("api");
|
||||||
|
var names = action.Controller.ControllerType.Namespace.Split('.');
|
||||||
|
if (names.Length > 2)
|
||||||
|
{
|
||||||
|
routeTemplate.Append(names[^2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Controller
|
||||||
|
var controllerName = action.Controller.ControllerName;
|
||||||
|
if (controllerName.EndsWith("Service"))
|
||||||
|
controllerName = controllerName[0..^7];
|
||||||
|
|
||||||
|
routeTemplate.Append($"/{controllerName}");
|
||||||
|
|
||||||
|
// Action
|
||||||
|
var actionName = action.ActionName;
|
||||||
|
if (actionName.EndsWith("Async"))
|
||||||
|
actionName = actionName[..^"Async".Length];
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(actionName))
|
||||||
|
routeTemplate.Append($"/{actionName}");
|
||||||
|
|
||||||
|
return routeTemplate.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetHttpMethod(ActionModel action)
|
||||||
|
{
|
||||||
|
var actionName = action.ActionName;
|
||||||
|
return actionName.StartsWith("Get") ? "GET" : "POST";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -6,13 +6,23 @@ namespace Dipper.Alioth.Web;
|
||||||
|
|
||||||
public class StarHost
|
public class StarHost
|
||||||
{
|
{
|
||||||
public static void Run(string[] args, Action<StarOption> action)
|
private StarHost()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public StarHost CreateHost()
|
||||||
|
{
|
||||||
|
return new StarHost();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Run(string[] args, Action<StarOption> action)
|
||||||
{
|
{
|
||||||
var app = Configure(args, action);
|
var app = Configure(args, action);
|
||||||
app.Run();
|
app.Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Task RunAsync(string[] args, Action<StarOption> action)
|
public Task RunAsync(string[] args, Action<StarOption> action)
|
||||||
{
|
{
|
||||||
var app = Configure(args, action);
|
var app = Configure(args, action);
|
||||||
|
|
||||||
|
@ -20,7 +30,7 @@ public class StarHost
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static WebApplication Configure(string[] args, Action<StarOption> action)
|
private WebApplication Configure(string[] args, Action<StarOption> action)
|
||||||
{
|
{
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue