实现自定义过滤器时,我目前正在使用一种模式,其中我的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注册一个过滤器?
答案 0 :(得分:1)
除非您有充分的理由认为该建议是继承RequestFilterAttribute专门用于此目的,这也会让您忽略为优先级和复制提供默认实施()强>
如果您确实想要坚持IHasRequestFilter
,那么Copy()
的正确实施是:
public virtual IHasRequestFilter Copy()
{
return (IHasRequestFilter)this.MemberwiseClone();
}
这确保了每个请求只使用一个Copy而不是同一个实例,这对于确保ThreadSafety用于过滤器维护状态非常重要。