В приведенном ниже методе есть множество операторов case (многие из них были удалены), которые обращаются к классам Manager. Например, первый вызывает ApplicationManager.GetByGUID. Каждый раз, когда используется класс «менеджер», происходят проверки безопасности.
Проблема: у меня есть объекты, которые могут быть разрешены для некоторых из них, но не для всех. Поэтому, когда этот метод запускается, если один из них выйдет из строя, он вызовет исключение безопасности и приведет к сбою всего отчета.
Кто-то предложил мне просто разбрасывать блоки try-catch вокруг каждого случая, но чем больше я читаю, тем больше мне кажется, что это может быть небрежно. По общему признанию, я не очень разбираюсь в исключениях ... Я надеялся, что кто-то может предложить способ сделать это более изящно ... Мне нужно иметь возможность возвращать хорошие данные и игнорировать те, которые вызывают исключения безопасности ... или, может быть, в этом случае подойдут пробные уловы?
Надеюсь, это имеет смысл ... спасибо
private string GetLookup(string value, string type)
{
MySqlConnection mconn = new MySqlConnection(ConfigurationSettings.AppSettings["UnicornConnectionString_SELECT"]);
try
{
mconn.Open();
lock (reportLookups)
{
if (reportLookups.ContainsKey(type+value))
return reportLookups[type+value].ToString();
else if (reportLookups.ContainsKey(value))
return reportLookups[value].ToString();
else
{
switch (type)
{
case "ATTR_APPLICATIONNAME":
if (value != Guid.Empty.ToString())
{
reportLookups.Add(type + value, applicationManager.GetByGUID(value).Name);
}
else
{
reportLookups.Add(type + value, "Unknown");
}
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_CITYNAME":
reportLookups.Add(type + value, UMConstantProvider.UMConstantProvider.GetConstant<UMString64>(int.Parse(value), UMMetricsResourceLibrary.Enumerations.ConstantType.CITY_NAME, ref mconn));
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_COUNTRYNAME":
reportLookups.Add(type + value, UMConstantProvider.UMConstantProvider.GetConstant<UMString2>(int.Parse(value), UMMetricsResourceLibrary.Enumerations.ConstantType.COUNTRY_NAME, ref mconn));
mconn.Close();
return reportLookups[type + value].ToString();
break;
case "ATTR_ITEMDURATION":
MediaItem mi = mediaItemManager.GetMediaItemByGUID(value);
if (mi.MediaItemTypeID == (int)MediaItemType.ExternalVideo || mi.MediaItemTypeID == (int)MediaItemType.ExternalAudio)
{
reportLookups.Add(type + value, mediaItemManager.GetMediaItemByGUID(value).ExternalDuration);
mconn.Close();
return reportLookups[type + value].ToString();
}
else
{
List<BinaryAsset> bins = fileSystemManager.GetBinaryAssetsByMediaItemGuid(value, mi.DraftVersion);
var durationasset = from d in bins
where d.Duration != 0
select d.Duration;
if (durationasset.Count() > 0)
{
reportLookups.Add(type + value, durationasset.ToList()[0]);
}
else
{
reportLookups.Add(type + value, 0);
mconn.Close();
return reportLookups[type + value].ToString();
}
}
break;
}
}
return string.Empty;
}
}
finally
{
mconn.Close();
}
}
type, который передается - так почему бы не разделить его на разные методы? сделает ваш код более читабельным / легким в обслуживании. кроме того, почему вы делаетеmconn.Close();в обоих операторах case и в блоке finally? просто сделай это один раз в конце. - person RPM1984   schedule 03.11.2010using, когда это возможно. тогда вам вообще не нужно звонить.Close(). Преимуществоusingтакже в том, что вы можете ограничить код базы данных внутри блока, что приведет кopen late, close earlyсоветам по соединениям с базой данных. удачи. - person RPM1984   schedule 03.11.2010string typeна перечисление. опять же, более читабельный / поддерживаемый (не говоря уже о безопасности типов). - person RPM1984   schedule 03.11.2010