3

我正在使用一个 ServiceStack 请求过滤器,我想检查 requestDTO 参数的属性之一。此参数在运行时是强类型的,但在编译时是通用对象。

该过滤器将用于多个服务调用,因此 requestDTO 类型将根据已调用的类型而改变。因此我不能对其进行特定的演员表。但是,无论类型如何,requestDTO 对象都将始终具有一个名为“AppID”的字符串属性。这是我希望访问的属性。

这是我的代码(当前未编译):

 public override void Execute(ServiceStack.ServiceHost.IHttpRequest req, ServiceStack.ServiceHost.IHttpResponse res, object requestDto)
        {
            //Check only for non-local requests
            if (!req.IsLocal)
            {                
                var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault();

                var errResponse = DtoUtils.CreateErrorResponse("401", "Unauthorised", null);
                var contentType = req.ResponseContentType;
                res.WriteToResponse(req, errResponse);
                res.EndRequest(); //stops further execution of this request
                return;
            }
        }

此行不编译:

 var app = this._appIDs.Apps.Where(x => x.ID == requestDto.AppID).FirstOrDefault();

我是否需要在这里处理反射才能访问我的对象,或者是否有某种内置于 ServiceStack 本身的方法?

4

1 回答 1

5

将通用功能应用于常见请求 DTO 时的首选方法是让它们实现相同的接口,例如:

public interface IHasAppId
{
    public string AppId { get; set; }
}

public class RequestDto1 : IHasAppId { ... }
public class RequestDto2 : IHasAppId { ... }

然后在你的过滤器中你可以这样做:

var hasAppId = requestDto as IHasAppId;
if (hasAppId != null)
{
    //do something with hasAppId.AppId
    ...
}

您也可以避免使用接口并使用反射,但这会更慢且可读性较差,因此我推荐使用接口。

于 2013-11-01T09:17:01.840 回答