2

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

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 实现接口的 dto 注册过滤器?

4

1 回答 1

1

除非您有充分的理由推荐该建议是从RequestFilterAttribute继承,后者专门用于此目的,这也让您忽略为PriorityCopy()提供默认实现。

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

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

这确保每个请求只使用一个副本而不是同一个实例,这对于确保过滤器保持状态时的线程安全非常重要。

于 2013-04-09T13:43:45.417 回答