我们有一个多租户应用程序,其中运行的网站实例存储在ConcurrentDictionary<string, SiteInstance>
中,其中string
是该网站的主机名。
我们现在要求每个站点实例支持多个主机名。作为临时解决方案,我首先按键搜索,如果找不到匹配项,则对字典执行LINQ查询以查找具有匹配主机名的实例。
这里有更好/更快的解决方案吗?
注意:映射到每个站点实例的主机名列表是可变的。
答案 0 :(得分: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();
答案 1 :(得分:2)
刚刚写了一个复杂的答案,我已经看过@Mudu的答案,如果它很简单,这显然是一个更好的方法。无论如何,这是我的...猜测一个优势可能是这很容易扩展。
创建一个继承自List<String>
的小类,名为HostNames
。然后,如果列表中的任何内容与其他任何内容匹配,您可以覆盖Equals()
方法和GetHashCode()
以返回匹配。
然后,您可以将此类用作词典键ConcurrentDictionary<HostNames, SiteInstance>
要检索构建hostName对象所需的值:
var hostName = new HostNames();
hostName.Add("hostName1");
var siteInstance = concurrentDictionary[hostName];