我正在使用Servicestack。我的服务有一个基类,就像这样:
public abstract class ServiceHandlerBase : Service
,然后关注其中的一些方法和属性。我已经有几种方法可以访问IRequest对象,例如:
protected AlfaOnline GetContactItem()
{
string deviceUUID = Request.Headers.Get(Constants.DEVICE_UUID); // <-- calling this method from constructor will give NullRef on Request here
string authToken = Request.Headers.Get(Constants.AUTH_TOKEN);
// do stuff
return existingContactItem;
}
在我的服务实现中运行良好,在那里没有问题。
现在,我想直接从基类中使用完全相同的方法 ,在构造函数中调用它:
public ServiceHandlerBase()
{
AlfaOnline ao = GetContactItem();
}
但是如上所述,我然后在NullReferenceException
对象上得到了一个Request
。
何时可以访问和使用Request对象?因为在服务实现中它不是null。
答案 0 :(得分:1)
在注入之前,您无法在构造函数中访问任何依赖,例如IRequest
,只有在初始化Service
类之后(如调用Service方法时),才能访问它们。
您可以在执行任何服务之前使用Custom Service Runner执行自定义逻辑,例如:
public class MyServiceRunner<T> : ServiceRunner<T>
{
public override void OnBeforeExecute(IRequest req, TRequest requestDto) {
// Called just before any Action is executed
}
}
并使用以下命令在您的AppHost中向ServiceStack注册:
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(ActionContext ctx)
{
return new MyServiceRunner<TRequest>(this, ctx);
}
但是,如果您只想为Service类运行一些逻辑,则可以在基类中覆盖OnBeforeExecute()
,例如:
public abstract class ServiceHandlerBase : Service
{
public override void OnBeforeExecute(object requestDto)
{
AlfaOnline ao = GetContactItem();
}
}
有关有效的示例,请参见ServiceFilterTests.cs。
如果您要实现IService
而不是继承Service
基类,则可以实现IServiceBeforeFilter。
新的服务过滤器可从v5.4.1(现在为available on MyGet)中获得。