0

我们有一个多租户应用程序,其中运行的站点实例存储在 a 中ConcurrentDictionary<string, SiteInstance>,其中string是站点的主机名。

我们现在需要支持每个站点实例的多个主机名。作为临时解决方案,我首先按键搜索,如果未找到匹配项,则对字典执行 LINQ 查询以查找具有匹配主机名的实例。

这里有更好/更快的解决方案吗?

注意:映射到每个站点实例的主机名列表是可变的。

4

2 回答 2

2

您不能使用具有相同SiteInstance和不同键的多个键值对吗?

var instance = new SiteInstance();
dict.TryAdd("hostname1", instance); // in actual code, you should check
dict.TryAdd("hostname2", instance); // TryAdd's return value

主机名必须是唯一的。要访问不同的 SiteInstance对象(根据注释进行编辑),您可以使用附加对象HashSet<SiteInstance>或使用 LINQ(但不是线程安全的):

var instances = dict.Values.Distinct();
于 2012-10-30T10:27:57.143 回答
2

刚刚写了一个复杂的答案,我看过@Mudu的答案,如果它那么简单,显然是一个更好的方法。无论如何,这是我的……猜想一个优点可能是它很容易扩展。

创建一个继承自 的小类List<String>,称为 HostNames. 然后,您可以覆盖该Equals()方法并GetHashCode()在列表的任何内容与其他任何内容匹配时返回匹配项。

然后你可以使用这个类作为你的字典键ConcurrentDictionary<HostNames, SiteInstance>

要检索值,您需要构建一个 hostName 对象:

var hostName = new HostNames();
hostName.Add("hostName1");
var siteInstance = concurrentDictionary[hostName];
于 2012-10-30T10:32:23.533 回答