Я не уверен в том, что было бы «лучшим» соответствием для архитектуры WCF, но вы должны рассмотреть возможность установки для InstanceContextMode значения Single, поскольку вы, вероятно, будете выполнять много шагов синхронизации для что вы хотите сделать здесь.
Как насчет этого? Очевидно, вам потребуется выполнить некоторую синхронизацию с самим словарем, но, по крайней мере, это начало.
private IDictionary<string, RequestToken> RequestTokens =
new Dictionary<string, RequestToken>();
public MyResponse MyMethod(MyRequest request)
{
// get the MD5 for the request
var md5 = GetMD5Hash(request);
// check if another thread is processing/has processed an identical request
RequestToken token;
if (RequestTokens.TryGetValue(md5, out token))
{
// if the token exists already then wait till we can acquire the lock
// which indicates the processing has finished and a response is ready
// for us to reuse
lock (token.Sync)
{
return token.Response;
}
}
else
{
var token = new Token(md5);
lock (token.Sync)
{
RequestTokens.Add(md5, token);
// do processing here..
var response = ....
token.Response = response;
return response;
}
}
}
private class RequestToken
{
private readonly object _sync = new object();
public RequestToken(string md5)
{
MD5 = md5;
}
public string MD5 { get; private set; }
public object Sync { get { return _sync; } }
public MyResponse Response { get; set; }
}
Для меня это то, что я хотел бы абстрагироваться от своей бизнес-логики, и я лично буду использовать PostSharp и напишу небольшой атрибут для обработки всего этого.
Я написал атрибут Memoizer , который делает что-то похожее в строках кэширования ответов, основанных на запросе, но без шагов синхронизации, так что вы, вероятно, можете посмотреть, что я сделал, и изменить это соответственно для достижения того, что вы после.