मैं प्रतिनिधियों की संचय संस्करण बनाने के लिए निम्नलिखित विस्तार तरीकों का उपयोग:
public static Func<T, TResult> AsCached<T, TResult>(this Func<T, TResult> function)
{
var cachedResults = new Dictionary<T, TResult>();
return (argument) =>
{
TResult result;
lock (cachedResults)
{
if (!cachedResults.TryGetValue(argument, out result))
{
result = function(argument);
cachedResults.Add(argument, result);
}
}
return result;
};
}
public static Func<T1, T2, TResult> AsCached<T1, T2, TResult>(this Func<T1, T2, TResult> function)
{
var cachedResults = new Dictionary<Tuple<T1, T2>, TResult>();
return (value1, value2) =>
{
TResult result;
var paramsTuple = new Tuple<T1, T2>(value1, value2);
lock(cachedResults)
{
if (!cachedResults.TryGetValue(paramsTuple, out result))
{
result = function(value1, value2);
cachedResults.Add(paramsTuple, result);
}
}
return result;
};
}
public static Func<T1, T2, T3, TResult> AsCached<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> function)
{
var cachedResults = new Dictionary<Tuple<T1, T2, T3>, TResult>();
return (value1, value2, value3) =>
{
TResult result;
var paramsTuple = new Tuple<T1, T2, T3>(value1, value2, value3);
lock(cachedResults)
{
if (!cachedResults.TryGetValue(paramsTuple, out result))
{
result = function(value1, value2, value3);
cachedResults.Add(paramsTuple, result);
}
}
return result;
};
}
और इसी तरह एन मापदंडों के लिए ...
मामले में यह कोड से स्पष्ट नहीं है, मैं तर्कों के साथ एक tuple बनाएँ, और tuple का उपयोग एक शब्दकोश के लिए एक कुंजी के रूप में करें जो तर्क के प्रत्येक सेट के लिए वापसी मूल्य रखता है। ध्यान दें कि हर बार जब आप AsCached
पर कॉल करते हैं, तो आप एक अलग कैश बनाते हैं।
आप इस प्रकार इन तरीकों का उपयोग कर सकते हैं:
private Func<int, SomeEntity> _getCached;
public SomeEntity Get(int id)
{
if (_getCached == null)
{
Func<int, SomeEntity> func = GetImpl;
_getCached = func.AsCached();
}
return _getCached(id);
}
private SomeEntity GetImpl(int id)
{
return base.GetItem<SomeEntity>
("select * from SomeEntities where id = @idParam",
new { idParam = id});
}
मेरे लिए यह लगता है कि आप तरह की एक पहचान नक्शे का वर्णन कर रहे हैं। इस मामले में आपकी कुंजी आईडी के साथ मिलकर टाइपहेडल हो सकती है। पहचान मानचित्रों की बात यह है कि आप यह सुनिश्चित करना चाहते हैं कि वे किसी प्रकार के संदर्भ से बंधे हैं, वैश्विक पहचान मानचित्र को अमान्य करना मुश्किल है –