2013-12-10 76 views
3

我在我的ServiceStack項目上運行Resharper代碼分析,並警告某些未使用的服務操作的參數。這是真的。ServiceStack - 處理'參數從未使用'警告

我現在面臨的困境是,在那裏有沒有參數需要的路由,比如一個簡單的GET請求返回課程列表:

[Route("/Courses","GET")] 
public class ListCoursesRequest : IReturn<List<CourseResult>> {} 

那麼行動將不會使用request對象(ListCoursesRequest),導致此警告。

public List<CourseResult> Get(ListCoursesRequest request) 
{ 
    ... 
} 

警告:參數'請求'從未使用過。

我可以讓Resharper通過使用忽略註釋來忽略警告,但我不喜歡用這種方式亂拋我的代碼。

但是由於ServiceStack根據參數ListCoursesRequest路由到動作,因此無法刪除它,除非有不同的方法來處理無參數路由場景。也許是行動的一個屬性?

我試圖採用最佳實踐,並保持清潔的代碼,我知道這是化妝品,我懷疑這只是我必須忍受的事情,但我想我會問。

+3

' GC.KeepAlive(請求);'? –

+1

@MarcGravell嗯,那很簡單。我知道有人會有解決方案。 :) – Scott

回答

1
GC.KeepAlive(request); 

GC.KeepAlive documentation

重要的:

的存活時間的方法不執行任何操作,併產生比延伸傳遞作爲參數的對象的生命週期的其它無副作用。


雖然蛇形丘的溶液(+1)是可用它有點麻煩,如所提到的,就好像使用的代碼註釋。我認爲MarcGravell的建議是一個簡單的修復,即最終代碼分析系統也是獨立的。 不幸的是,他從未發佈過答案,只是一個評論。

/// <summary> 
/// Does nothing, just avoids "parameter/variable is not used" warnings. 
/// </summary> 
/// <typeparam name="T">The type.</typeparam> 
/// <param name="value">The value.</param> 
[Conditional("NEVER")] 
public static void DummyUsage<T>(this T value) 
{   
    // just dummy code 
    if (value is object) 
    { 
     return; 
    } 
} 

的用法很簡單:

4

此建議僅比添加忽略註釋好一點,但在這裏你去:

如果添加ReSharper code annotations到您的解決方案,您可以用UsedImplicitly屬性標記您的DTO和服務類。指定ImplicitUseTargetFlags.WithMembers,以便您不必註釋每個違規的屬性和方法。

[Route("/Courses", "GET"), UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] 
public class ListCoursesRequest : IReturn<List<CourseResult>> {} 

[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] 
public class CoursesService : Service { 
    public List<CourseResult> Get(ListCoursesRequest request) { } 
} 

您可以通過打開ReSharper的選擇和去代碼註釋標籤這些ReSharper的註釋添加到您的解決方案。有一個按鈕將默認實現複製到剪貼板。然後,您可以將代碼粘貼到解決方案中的新文件中。另外,我認爲JetBrains提供了一個可以添加到解決方案中的DLL,但我更喜歡粘貼代碼。

1

我創建了下面的擴展方法,它會被編譯由於條件屬性中所以它實際上只是一個「裝飾」跳過

public List<CourseResult> Get(ListCoursesRequest request) 
{ 
    request.DummyUsage(); // without this line you get a parameter not used warning 
}