我在我的ServiceStack项目上运行Resharper代码分析,它会警告某些未使用的服务操作的参数。这是真的。
我面临的困境是在没有参数的路线上,例如返回课程列表的简单GET请求:
[Route("/Courses","GET")]
public class ListCoursesRequest : IReturn<List<CourseResult>> {}
然后该操作将不会使用请求对象(ListCoursesRequest
),从而导致此警告。
public List<CourseResult> Get(ListCoursesRequest request)
{
...
}
警告:从不使用参数'request'。
我可以让Resharper通过使用忽略注释来忽略警告,但我不喜欢以这种方式乱丢我的代码。
但是因为ServiceStack基于参数ListCoursesRequest
路由到操作,所以除非有不同的方法来处理无参数路由方案,否则无法将其删除。也许是行动的一个属性?
我正在尝试采用最佳做法并保持清洁代码,我知道这是化妆品,我怀疑这只是我必须忍受的东西,但我想我会问。
答案 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);
重要的:
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
}