Обратите внимание, что значение в классе будет жить столько же, сколько сам объект службы.Сервисный объект создается и уничтожается при каждом запросе к сервису, поэтому Quote
будет жить только в течение одного запроса.Единственная цель, которую я вижу для чего-то подобного, - это кэш для каждого запроса (т. Е. Во время одного запроса вы обращаетесь к объекту Quote
пять раз. Вам нужно только один раз просмотреть его из резервного хранилища).
- Клиент делает запрос к серверу
- Сервер создает
FunkyService
класс - Клиентские вызовы
GetQuote
- Сервер заполняет
Quote
в классе. - Клиент завершает вызов.
- Сервер завершает запрос, удаляет объект
FunkyService
из (2). - Значение
Quote
больше не сохраняется в классепотому что объект исчез.
Редактировать: Похоже, что вы хотите сделать это так, чтобы получение объекта цитаты было сделано в одном месте, но это не таквызываться снова и снова (т. е. делать несколько запросов к базе данных, когда нужен только один).Вы можете реализовать шаблон проектирования кешируемых свойств, чтобы иметь кеш для каждого запроса без использования переменной класса.Это будет выглядеть примерно так:
private Dictionary<int, Quote> _quoteCache =
new Dictionary<int, Quote>(); // cache storage - NEVER ACCESS DIRECTLY
public Quote GetQuote(int quoteid)
{
// cache is invalid, so populate
if (!_quoteCache.ContainsKey(quoteid))
{
_quoteCache.Add(quoteid, _repo.single(quoteid));
}
// return back to caller
return _quoteCache[quoteid];
}
В приведенном выше примере в кеше хранятся все уникальные цитаты, извлеченные из базы данных.Поэтому, если вы вызываете GetQuote(5)
пять раз подряд, он извлекается из базы данных только через _repo
один раз.Однако если вы позвоните GetQuote(6)
, то он снова попадет в базу данных, потому что эта кавычка недоступна из кэша.После этого и 5, и 6 по-прежнему сохраняются в кэше до тех пор, пока запрос на обслуживание не будет завершен и ликвидирован.
Edit2: В приведенном вами примере:
var t = GetTags(_quote);
// then do something with t, I may pass to another method:
if(IsClosed(_quote)){}
Вместо того, чтобы ссылаться на переменную класса, пусть ваш репозиторий вернет объект Quote
и передаст эту ссылку, например:
private Quote GetQuote(int quoteid)
{
return _repo.single(quoteid); //or whatever
}
// other code
var q = GetQuote(quoteid); // get the quote once
var t = GetTags(q); // q doesn't have to retrieve from repo again
if (IsClosed(q)) {}
// etc.