2013-04-09 43 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