我正在try 自动实现我的应用程序的CRUD.
我使用的是最小的API设计,我写了一个ICrudService<T>
,它可以是Get
、Single
、Add
、Update
和Delete
的T
实体.
现在,我正在try 将端点部分自动化.我可以让Get
和Single
使用这个代码:
Type[] types =
{
typeof(Place),
typeof(PlaceLink),
};
foreach (var type in types)
{
var scope = app.Services.CreateScope();
var serviceType = typeof(ICrudService<>).MakeGenericType(type);
dynamic service = scope.ServiceProvider.GetService(serviceType);
app
.MapGet($"/{type.Name.ToLower()}s", async () =>
{
var result = await service.Get();
return Results.Ok(result);
})
.WithTags($"{type.Name}s");
app
.MapGet($"/{type.Name.ToLower()}s/" + "{id}", async (int id) =>
{
var result = await service.Single(id);
return Results.Ok(result);
})
.WithTags($"{type.Name}s");
}
这给了我想要的昂首阔步:
但我正在努力应对Add
的挑战(可能还有Update
的挑战).
以下是Add
部分的实际代码:
app
.MapPost($"/{type.Name.ToLower()}s/" + "{id}", async(TYPE_OF_ENTITY entity) =>
{
var result = await service.Add(entity);
return Results.Ok(result);
})
.WithTags($"{type.Name}s");
我可以通过使用.MakeGenericType(type)
函数得到service
.但在这里,async(TYPE_OF_ENTITY entity)
是一个匿名函数的签名,我不知道是否有什么技巧可以用来通过使用type
变量来指定entity
变量中的Type
.
关键字dynamic
可以工作,但Swagger
无法知道My Entity的类型,因此图形用户界面显示为RAW,没有任何请求的默认模式:
如何动态创建匿名函数的签名?