2013-04-09 45 views
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注册一个实现界面的所有dtos的过滤器?

回答

1

除非你有一个很好的理由的建议是从RequestFilterAttribute这是专门意味着为此它也可以让你忽略了提供默认实现优先复制()继承。

如果你想坚持到IHasRequestFilter然后Copy()正确执行是:

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

这将确保只有一个副本是每个请求使用,不一样的情况下,重要的是确保ThreadSafety当你的过滤器保持状态。

+0

感谢mthyz,我不知道RequestFilterAttribute。我会用它。 – sungiant 2013-04-09 13:55:35

+0

也许我没有把它说得够好,但我真正想知道的是有一个具有MyFilter属性的dto的模式,并且还实现了IMyInterface。然后在属性的逻辑内将dto对象转换为IMyInterface并设置接口的属性。这是预期的模式?是否有一种方法可以通过AppHost注册一个实现给定接口的所有dtos的过滤器?看起来很乱,不得不用一个属性来标记dto,并让它实现一个接口。这是预期的用例吗? – sungiant 2013-04-09 14:05:45

+0

我不知道为什么你需要IMyInterface,而不是直接投射到请求DTO?我只会使用一个接口来处理普通的DTO。这个例子也没有说明你为什么要使用过滤器,而不是在服务中正常处理它。 – mythz 2013-04-09 14:07:30