Dans la méthode ci-dessous, il existe de nombreuses instructions de cas (beaucoup ont été supprimées) qui appellent les classes Manager. Par exemple, le premier appelle ApplicationManager.GetByGUID. Chaque fois qu'une classe "manager" est utilisée, des contrôles de sécurité ont lieu. Problème: J'ai des entités qui peuvent être autorisées à certains d'entre eux, mais pas à tous. Donc, quand cette méthode est exécutée, si l'un d'entre eux craps, il va jeter une exception de sécurité et planter tout le rapport. Quelqu'un m'a suggéré que je pourrais juste jeter des blocs try-catch autour de chaque cas, mais plus je lis plus je me sens comme ça pourrait être bâclée. Je ne suis pas très au courant des exceptions ... J'espérais que quelqu'un pourrait suggérer un moyen de le faire avec plus de finesse ... Je dois être en mesure de récupérer de bonnes données et ignorer celles qui présentent des exceptions de sécurité .... ou peut-être essayer-attrape sont ok dans ce cas?Attrapés essayés ou y a-t-il un meilleur moyen?
espoir qui fait sens ... grâce
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();
}
}
Je pense que c'est plus un cas de refactoring de code ici. votre commutation sur le paramètre 'type', qui est passé - alors pourquoi ne pas séparer les différentes méthodes? rendra votre code beaucoup plus lisible/plus facile à maintenir. aussi, pourquoi faites-vous 'mconn.Close();' dans les instructions case * et * finally block? faites-le une fois dans le finalement. – RPM1984
+1 @ RPM1984, je suis d'accord –
wow c'était rapide, merci les gars –