我正在查看几个IoC内容,以便选择一个在我的工作中使用,并且在查看LightInject的代码库时,我发现了一些我不理解的东西。。。
在ServiceContainer的GetInstance(Type serviceType, string serviceName)
方法中,它从参数中形成一个键,并在"namedDelegates"上调用"Search":
var key = Tuple.Create(serviceType, serviceName);
var instanceDelegate = namedDelegates.Search(key);
namedDelegates是一个ImmutableHashTree<TKey, TValue>
,一个内部类,它实现(根据自己的注释(:
/// A balanced binary search tree implemented as an AVL tree.
我之所以选择LightInject,是因为它在Daniel Palme的IoC性能比较中获得了优异的分数,我很困惑为什么在这种情况下,O(logn(二进制搜索算法比使用O(1(字典更可取?
有人能在这里教育我吗?
没有使用,只是偷看了源代码
我的理论是,从API的角度或消费开发人员的角度来看,重复的密钥可以根据需要使用。Search(TKey)
负责检查它在树中发现的重复项,所以这就是我想到的。
另一个可能也是为了性能——正如你在问题中提到的,它看起来相当快。他们在ImmutableHashTree
上的搜索很好地处理了找不到值的问题,因为它只返回default(TValue)
。
这似乎比下面的Dictionary<TKey, TValue>
更快,后者已经在做很多相同的工作来根据给定的密钥找到你的价值。
if (myDictionary.ContainsKey(myKey))
return myDictionary[myKey]; // Practically double the work has been done
else
return default(TValue);
try
{
return myDictionary[myKey];
}
catch(Exception ex)
{
// Exceptions can be expensive.
return default(TValue);
}
他们的方法只搜索一次,不担心捕捉异常来处理密钥不存在的事实。
同样,这是我收集的只是对源代码的快速浏览,不应该被认为是具体的。