从ServiceRunner访问呼叫服务?

时间:2013-06-04 16:33:59

标签: servicestack

我想从Service ServiceRunner方法中访问调用OnBeforeRequest(),以便访问调用服务类中的对象。在MVC中,我可以创建一个覆盖BaseController的类OnActionExecuting(),我可以轻松地访问Data。但是,使用ServiceRunner,因为它不是从Service派生的,所以我看不到到达Service对象的方法。

样品服务:

public class ProductsService : Service
{
    private MyData _data = new MyData();

    public MyData Data
    {
         get { return _data; }
    }

    public object Get(GetProduct request)
    {
         // ...
         return product;
    }
}

在我的自定义ServiceRunner中,如何从ProductsService检索OnBeforeRequest()对象,以便我可以访问Data

public class MyServiceRunner<T> : ServiceRunner<T>
{
    public override void OnBeforeExecute(IRequestContext requestContext, T request)
    {
        // var productService = ?

        base.OnBeforeExecute(requestContext, request);
    }
}

1 个答案:

答案 0 :(得分:3)

经过多次挖掘,看起来无法做到这一点。服务操作在ServiceRunner中作为未命名的lamdba委托提供。没有提及该服务。

我找到了一个解决方法。我首先使用

AppHost.Configure()注册了MyData
container.RegisterAutoWired<MyData>();

我将MyData声明移动到这样的过滤器属性:

public class UseMyDataAttribute : RequestFilterAttribute
{
    public MyData Data { get; set; } // injected by Funq IoC. 

    public override void Execute(IHttpRequest req, IHttpResponse res, object responseDto)
    {
        Data.SessionID = req.GetSessionId();
    }
}

这样我就可以将[UseMyData]应用于ProductsService类,并且可以将会话ID设置为Data