【问题标题】:How to solve code analysis warning CA1506 : "Avoid excessive class coupling"如何解决代码分析警告 CA1506:“避免过度的类耦合”
【发布时间】:2013-10-08 05:32:10
【问题描述】:

我正面临以下代码的 CA1506 代码分析警告

private void ShowProductStatistics(object obj)
    {
        this.currentProduct = obj as Products;
        Task.Factory.StartNew(() =>
        {
            var topOrderQuery = (from orderDetail in new XPQuery<OrderDetails>(new Session())
                                 where
                                     orderDetail.ProductID.ProductID == currentProduct.ProductID
                                 orderby
                                     (orderDetail.UnitPrice * orderDetail.Quantity) descending
                                 select new TopOrder
                                 {
                                     OrderId = orderDetail.OrderID.OrderID,
                                     TotalSales = orderDetail.UnitPrice * orderDetail.Quantity
                                 }).ToList().Take(10);

            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.TopProduct = topOrderQuery; }));

            var orderPerYearQuery = (from order in new XPQuery<OrderDetails>(new Session())
                                     where order.ProductID.ProductID == currentProduct.ProductID
                                     group order by new { order.OrderID.OrderDate.Year }
                                         into g
                                         select new OrderPYear
                                         {
                                             TotalOrder = g.Count(),
                                             OrderYear = g.Key.Year
                                         }).ToList();
            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.OrderPerYear = orderPerYearQuery; }));

            var salesPerYearQuery = (from order in new XPQuery<OrderDetails>(new Session())
                                     where order.ProductID.ProductID == currentProduct.ProductID
                                     group order by new { order.OrderID.OrderDate.Year }
                                         into g
                                         select new SalesPYear
                                         {
                                             Sales = g.Sum(p => p.UnitPrice * p.Quantity),
                                             Year = g.Key.Year
                                         }).ToList();
            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.SalesPerYear = salesPerYearQuery; }));
        });
    }

我尝试按照 msdn 中给出的建议解决此警告,但未成功。 谁能帮我解决这个警告??

感谢和问候, 鲁德雷什

【问题讨论】:

  • 有一堆你看不到的类,它们是由 Linq 查询理解生成的。代码分析器看到了它们,但对此不以为然,只需抑制警告即可。
  • 汉斯您好,感谢您的建议,但我得到了解决方案。

标签: c# wpf .net-4.0 .net-4.5 code-analysis


【解决方案1】:

修改代码如下。

this.currentProduct = obj as Products;
        List<OrderDetails> orderDetailLIst = new XPQuery<OrderDetails>(new Session()).ToList();
        Task.Factory.StartNew(() =>
        {
            var topOrderQuery = (from orderDetail in orderDetailLIst
                                 where
                                     orderDetail.ProductID.ProductID == currentProduct.ProductID
                                 orderby
                                     (orderDetail.UnitPrice * orderDetail.Quantity) descending
                                 select new TopOrder
                                 {
                                     OrderId = orderDetail.OrderID.OrderID,
                                     TotalSales = orderDetail.UnitPrice * orderDetail.Quantity
                                 }).ToList().Take(10);

            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.TopProduct = topOrderQuery; }));

            var orderPerYearQuery = (from order in orderDetailLIst
                                     where order.ProductID.ProductID == currentProduct.ProductID
                                     group order by new { order.OrderID.OrderDate.Year }
                                         into g
                                         select new OrderPYear
                                         {
                                             TotalOrder = g.Count(),
                                             OrderYear = g.Key.Year
                                         }).ToList();
            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.OrderPerYear = orderPerYearQuery; }));

            var salesPerYearQuery = (from order in orderDetailLIst
                                     where order.ProductID.ProductID == currentProduct.ProductID
                                     group order by new { order.OrderID.OrderDate.Year }
                                         into g
                                         select new SalesPYear
                                         {
                                             Sales = g.Sum(p => p.UnitPrice * p.Quantity),
                                             Year = g.Key.Year
                                         }).ToList();
            DispatcherExt.CurrentDispatcher.BeginInvoke(new Action(() => { this.SalesPerYear = salesPerYearQuery; }));
        });

警告的原因是“来自 new XPQuery(new Session()) 中的 orderDetail”语句,我使用了 3 次,因此它发出警告。我试图减少耦合。

【讨论】:

  • 虽然您已经找到了自己的解决方案并想分享它,但您最好解释一下是什么原因造成的,并说明原因以及您是如何提出解决方案的。
  • 警告的原因是“来自新 XPQuery(new Session()) 中的 orderDetail”语句,我使用了 3 次,因此它发出警告。我试图减少耦合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多