如果我发送 HTTP Get 请求:
/api/Company/1
我有一个OwinMiddleware
我正在使用的地方context
来确定path
一个IAsyncRequest<T>
.
要知道要使用哪个异步请求,我有一个路径映射Type
到IAsyncRequest<T>
var mappings = new Dictionary<string, Type> { ["api/Company/{id}"] = typeof(GetCompanyRequest) }
Type request;
var result = mappings.TryGetValue(context.Requst.Path.Value, out request);
我使用JObject
创建一个实例GetCompanyRequest
var get = new JObject { ["id"] = "1" /* obtained from the url */ }
var instantiatedRequest = JObject.ToObject(request);
我使用的原因JObject
是对于 PUT 和 POST 请求,我将 JSON 正文直接反序列化为请求。
现在拼图的最后一块是object instantiatedRequest
通过中介管道发送它。显然Task<T> SendAsync<T>(IAsyncRequest<T> request)
行不通。
有趣的是,我不需要知道T
,因为我将始终将其序列化为 astring
以发回给用户。
那么签名Task<object> SendAsync(object request)
可以在当前的调解器框架中使用以适应这一点吗?(不要求它完成,这可能吗?)
看源代码
我在mediator.cs
private TWrapper GetHandler<TWrapper, TResponse>(object request, Type handlerType, Type wrapperType)
{
var requestType = request.GetType();
var genericHandlerType = _genericHandlerCache.GetOrAdd(requestType, handlerType, (type, root) => root.MakeGenericType(type, typeof(TResponse)));
var genericWrapperType = _wrapperHandlerCache.GetOrAdd(requestType, wrapperType, (type, root) => root.MakeGenericType(type, typeof(TResponse)));
var handler = GetHandler(request, genericHandlerType);
return (TWrapper) Activator.CreateInstance(genericWrapperType, handler);
}
private object GetHandler(object request, Type handlerType)
{
try
{
return _singleInstanceFactory(handlerType);
}
catch (Exception e)
{
throw BuildException(request, e);
}
}
第二个GetHandler
有我需要的参数,第一个是 by 调用的参数SendAsync
,我认为插入一些东西没有问题。
这样做有什么顾虑吗?