使用DB中的值切换语句

时间:2015-01-18 14:57:19

标签: c# .net switch-statement

您好我有以下情况 - 我的数据库中有一个包含区域网址的表格。对于代码中的每个区域Url,我都会调用Url区域来获取令牌。令牌在30分钟后到期,因此我无法将其存储在数据库中。

所以我目前有一个如下所示的开关语句:

        switch (zone)
        {
            case "https://dummy.url.zone1":
                 return _zoneOneToken;
            case "https://dummy.url.zone2":
                return _zoneTwoToken;
            case "https://dummy.url.zone3":
                return _zoneThreeToken;
            default:
                const string errorMessage = "Zone not found";
                Logger.Error(errorMessage);
                throw new ApplicationException(errorMessage);
        }

_zoneOneToken等是类中的私有字符串,它们在另一个类似于上面的switch语句中设置,然后使用上面的switch语句为每个区域获取。

我有一个DAO可以从数据库中获取所有区域 - 如下所示:

var allZones = zoneDao.GetAllZones();
然后

allZones将包含一个区域名称,区域ID和区域URL - 无论如何我可以在我的case语句中使用这个ZoneUrl而不是字符串值是硬编码的吗?

如果我添加了一个Enum类,其中包含如下所示的ZoneIds:

public enum ZoneEnum
{
    None = 0,
    ZoneOne = 1,
    ZoneTwo = 2,
    ZoneThree = 3
}

如果我之后使用了来自allZones的Id并将switch语句也传递给:

switch (zoneId)
{
    case ZoneEnum.ZoneOne :
     // how would I get zoneOne Url here?
     //removed rest of code for this for brevity
}

1 个答案:

答案 0 :(得分:0)

似乎区域ID应该用作唯一ID(可能作为相应表中的PRIMARY KEY)。因此,它将是您的switch语句的合理候选者。

除了识别和对象或记录之外,这样的ID不应包含任何其他信息。通过保持“中立”,如果细节(如URL)将来发生变化,则确保不必更改。


你可以有一个班级Zone

public class Zone
{
    public string Name { get;set; }
    public ZoneEnum Id { get; set; }
    public string URL { get; set; }

    public ZoneToken CreateToken()
    {
        ...
    }
}

如果您将所有区域都放在Dictionary<ZoneEnum, Zone>中,则可以获得此类标记

Zone zone = zonesDict[ZoneEnum.ZoneTwo];
ZoneToken token = zone.CreateToken();