服务堆栈过滤模式

时间:2013-04-09 12:43:35

标签: servicestack

实现自定义过滤器时,我目前正在使用一种模式,其中我的DTO都使用filter属性进行标记,并且还实现了一个自定义接口,该接口公开了我想在我的服务中使用的一些常见变量,例如:

public interface IMyInterface
{
    Int32 MyVariable { get; set; }
}

[MyFilter]
public class MyDto
    : IMyInterface
{
    public Int32 MyVariable { get; set; }
}

public class MyFilterAttribute 
    : Attribute
    , IHasRequestFilter 
{
    public int Priority { get { return 0; } }

    public IHasRequestFilter Copy () { return this; }

    public void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        var temp = requestDto as IMyInterface;

        if( temp != null )
        {
            var x = [something from the request object...]
            temp.MyVariable = x;
        }
    }
}

这是预期的模式吗?或者有没有办法单独使用界面?有没有办法为通过AppHost实现接口的所有dtos注册一个过滤器?

1 个答案:

答案 0 :(得分:1)

除非您有充分的理由认为该建议是继承RequestFilterAttribute专门用于此目的,这也会让您忽略为优先级复制提供默认实施()

如果您确实想要坚持IHasRequestFilter,那么Copy()的正确实施是:

public virtual IHasRequestFilter Copy()
{
    return (IHasRequestFilter)this.MemberwiseClone();
}

这确保了每个请求只使用一个Copy而不是同一个实例,这对于确保ThreadSafety用于过滤器维护状态非常重要。