【问题标题】:Service Stack Filter Patterns服务堆栈过滤器模式
【发布时间】:2013-04-09 12:43:34
【问题描述】:

在实现自定义过滤器时,我目前使用的模式是,我的 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 注册过滤器?

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    除非您有充分的理由推荐从 RequestFilterAttribute 继承,这是专门为此目的而设计的,这也让您忽略为 PriorityCopy() 提供默认实现

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

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

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

    【讨论】:

    • 谢谢 mthyz,我不知道 RequestFilterAttribute。我会用的。
    • 也许我说得不够好,但我真正想知道的是关于拥有一个具有 MyFilter 属性并实现 IMyInterface 的 dto 的模式。然后在属性的逻辑中将 dto 对象转换为 IMyInterface 并设置接口的属性。这是预期的模式吗?有没有办法为通过 AppHost 实现给定接口的所有 dto 注册过滤器?必须用属性标记 dto 并让它实现接口似乎很麻烦。这是预期的用例吗?
    • 我不知道您为什么需要 IMyInterface 并且不直接转换为 Request DTO?我只会使用一个接口来处理常见的 DTO。此示例也没有说明为什么您要使用过滤器而不是在服务中正常处理它。
    • 我正在使用接口,因为 MyVariable 对许多 DTO 来说很常见。在服务中正常处理是什么意思?您的意思是让服务堆栈自动映射 DTO?
    • 我正在使用过滤器,因为它让我可以访问 HttpRequest 对象,这样我就有机会在服务堆栈自动映射其余内容之前将自定义内容映射到我的 DTO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-07-02
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多