方法中的类耦合警告

时间:2013-02-14 01:16:19

标签: c# code-analysis

我收到了以下代码分析警告消息,我无法摆脱这个问题。请指教。

  

CA1506避免过多的类别耦合
  'RetailerController.RetailerFormSummary(string)'与来自13个不同命名空间的33种不同类型相结合。重写或重构方法以减少其类耦合,或考虑将方法移动到与其紧密耦合的其他类型之一。高于40的类耦合表明可维护性差,40到30之间的类耦合表明适度的可维护性,并且低于30的类耦合表明良好的可维护性。 OnePlaceWebApp.Web RetailerController.cs 564

RetailerFormSummary(string)方法如下:

 public ViewResult RetailerFormSummary(string retailerId)
 {
            AlertService alertService = new AlertService();
            PageInfo winnersPageInfo = new PageInfo();
            RetailerFormModelSummary model = new RetailerFormModelSummary();

            winnersPageInfo.ItemsPerPage = _configurationUtility.SummaryWinnersCount;
            winnersPageInfo.PageIndex = 0;

            model.CurrencyFormat = _configurationUtility.CurrencyFormat;
            model.DateFormat = _configurationUtility.DateFormat;
            model.DatePickerFormat = _configurationUtility.DatePickerFormat;
            model.Reps = _userService.GetReps(_userService.GetCurrentWebAppUserId());
            model.UsesDistricts = _configurationService.GetUsesDistricts();
            RetailerDto retailer = _retailerService.SelectRetailer(retailerId);

            if (retailer != null)
            {
                RetailerJurisdictionDto retailerJurisdiction = _retailerSummaryService.SelectRetailerJurisdiction(retailer.Id);
                JurisdictionDto territory = null;
                JurisdictionDto district = null;
                JurisdictionDto region = null;
                DateTime? lastVisit = _retailerSummaryService.SelectLastVisitUtcDate(retailer.Id);

                if (retailerJurisdiction != null)
                {
                    territory = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.Territory);
                    district = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.District);
                    region = _jurisdictionService.SelectJurisdictionUsingIdAndType(retailerJurisdiction.JurisdictionId, JurisdictionTypes.Region);
                }
                model.Address1 = retailer.Street1;
                if (retailer.Street2 != null)
                {
                    model.Address2 = retailer.Street2;
                }
                if (retailer.CorporateAccount != null)
                {
                    model.CorporateAccount = FormatService.GetTwoPartName(retailer.CorporateAccount.Number, retailer.CorporateAccount.Name, " - ");
                }
                model.CorporateAccountName = _termsService.SelectSingularTermValue(TermTypes.CorporateAccount);
                model.City = retailer.City;
                if (district != null)
                {
                    model.District = FormatService.GetTwoPartName(district.Number, district.Name, " - ");
                }
                if (lastVisit.HasValue)
                {
                    model.LastVisit = lastVisit.Value.DayOfWeek.ToString() + " " + lastVisit.Value.ToLocalTime().ToString(model.DateFormat, CultureInfo.CurrentCulture);
                }
                model.Note = _retailerSummaryService.SelectRetailerComment(retailer.Id);
                model.Phone = FormatService.FormatPhoneNumber(retailer.Phone);
                if (region != null)
                {
                    model.Region = FormatService.GetTwoPartName(region.Number, region.Name, " - ");
                }
                model.RegionTerm = _termsService.SelectSingularTermValue(TermTypes.Region);
                model.RetailerId = retailer.Id.ToString(CultureInfo.CurrentCulture);
                model.RetailerName = retailer.BusinessName;
                ViewBag.Title = retailer.BusinessName;
                model.RetailerNumber = retailer.DisplayNumber;
                model.RetailerAlerts = alertService.GetRetailerAlertsStringArray(retailer.RetailerAlerts);
                model.Route = _routeManagerService.GetRouteStringForRetailer(retailerId);
                model.Tasks = _retailerSummaryService.SelectRetailerTasks(retailer.Id);
                if (territory != null)
                {
                    model.Territory = FormatService.GetTwoPartName(territory.Number, territory.Name, " - ");
                }
                model.TerritoryTerm = _termsService.SelectSingularTermValue(TermTypes.Territory);
                model.WeeklySales = _retailerSummaryService.SelectWeeklySales(retailerId);
                model.Winners = _retailerWinnersService.SelectWinners(retailerId, WinnersSortTypes.Date, winnersPageInfo);
                model.ZipCode = retailer.ZipCode;
            }

            return View("RetailerFormSummary/RetailerFormSummary", model);
}

1 个答案:

答案 0 :(得分:4)

此警告告诉您在方法中实例化依赖的具体对象可能会导致可维护性问题。

以下是一些例子:

AlertService alertService = new AlertService();
PageInfo winnersPageInfo = new PageInfo();
RetailerFormModelSummary model = new RetailerFormModelSummary();
RetailerJurisdictionDto retailerJurisdiction = _retailerSummaryService.SelectRetailerJurisdiction(retailer.Id);
JurisdictionDto territory = null;
JurisdictionDto district = null;
JurisdictionDto region = null;

此方法的职责太多,拥有太多依赖项。你绝对应该查找Dependency Inversion PrincipleInversion of Control Framework以帮助你的依赖注入。这将有助于减少类/方法中的耦合。

咒语“取决于抽象”。

此外,Single Reponsibility Principle也适用于此。