ServiceStack - 处理'参数永不使用'警告

时间:2013-12-10 20:15:22

标签: c# resharper servicestack code-analysis

我在我的ServiceStack项目上运行Resharper代码分析,它会警告某些未使用的服务操作的参数。这是真的。

我面临的困境是在没有参数的路线上,例如返回课程列表的简单GET请求:

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

然后该操作将不会使用请求对象(ListCoursesRequest),从而导致此警告。

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

警告:从不使用参数'request'

我可以让Resharper通过使用忽略注释来忽略警告,但我不喜欢以这种方式乱丢我的代码。

但是因为ServiceStack基于参数ListCoursesRequest路由到操作,所以除非有不同的方法来处理无参数路由方案,否则无法将其删除。也许是行动的一个属性?

我正在尝试采用最佳做法并保持清洁代码,我知道这是化妆品,我怀疑这只是我必须忍受的东西,但我想我会问。

3 个答案:

答案 0 :(得分:6)

这个建议只比添加忽略评论好一点,但是你可以去:

如果您向解决方案添加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 :(得分:2)

GC.KeepAlive(request);

GC.KeepAlive documentation

重要的:

  

KeepAlive方法不执行任何操作,除了延长作为参数传入的对象的生命周期外,不会产生任何副作用。


虽然 esker 的解决方案(+ 1)是可用的,但是如上所述,它有点麻烦,就像使用代码注释一样。我认为 MarcGravell 的建议是一个简单的解决方案,最终也是独立于代码分析系统的。 不幸的是,他从未发布过答案,只是发表评论。

答案 2 :(得分:1)

我创建了以下扩展方法,由于条件属性,它将在编译期间被跳过,所以它实际上只是一个&#34;装饰器&#34;:

/// <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;
    }
}

用法很简单:

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