Я выполняю веб-сайт с 7-8 миллионами просмотров страницы в месяц. Не ужасно очень, но достаточно, что наш сервер чувствовал загрузку. Решение, которое мы выбрали, было просто: Кэш-память на уровне базы данных. Это решение работает хорошо, если загрузка базы данных является Вашей основной проблемой.
Мы начали использовать Кэш-память для кэширования всех объектов и результатов базы данных, которые наиболее часто использовались. Это действительно работало, но это также представило ошибки (мы, возможно, избежали некоторых из тех, если бы мы были более осторожными).
, Таким образом, мы изменили наш подход. Мы создали обертку базы данных (с теми же самыми методами как наша старая база данных, таким образом, было легко переключиться), и затем мы разделили его на подклассы для обеспечения memcached методов доступа к базе данных.
Теперь все, что необходимо сделать, решают, может ли запрос использовать кэшируемый (и возможно устаревший) результаты или нет. Большинство запросов, выполненных пользователями, теперь выбирается непосредственно от Кэш-памяти. Исключениями являются обновления, и вставляет, который для основного веб-сайта только происходит из-за входа. Эта довольно простая мера уменьшила нашу загрузку сервера приблизительно на 80%.
Здесь ответ - Generics.
public interface IParser<T> where T:IParser<T> {
T Parse(string s);
}
public class Parser : IParser<Parser> {
public Parser Parse(string s) {
return new Parser(s);
}
}
Нет в интерфейсе декларация, нет. Лучшее, что вы можете сделать - это использовать обобщенные типы:
public interface IParser<T>
where T: IParser<T>
{
T Parse(string s);
}
public class Parser
: IParser<Parser>
{
public Parser Parse(string s)
{
return new Parser(s);
}
}
Это не заставляет реализацию возвращать собственный тип, но, по крайней мере, позволяет ей это делать. Вот почему интерфейс IClonable
возвращает объект из своего метода Clone
, а не определенного типа.
---- Edit ----
Что нужно запомнить по этому вопросу: допустим, что мой код, для которого вы не t имеет какие-либо сведения о реализации, возвращает IParser
, а ваш код вызывает метод Parse
. Какой объект вы ожидаете вернуть, не зная конкретного типа возвращаемой ссылки IParser
? Я думаю, вы пытаетесь использовать интерфейсы для чего-то, для чего они не предназначены ...
Вы можете сделать это с Generics, но я бы, вероятно, придерживался возврата экземпляра интерфейса. Обратите внимание: поскольку класс реализует интерфейс, возврат его экземпляра - это нормально - он будет экземпляром того же типа и интерфейса.
public class Parser : I Parser
{
public IParser Parser( string s )
{
return Parser(s);
}
}
Да, и это известно как фабричный шаблон , только обычно он дополняется использованием частного конструктора и делает метод, возвращающий экземпляр, статическим, например :
public class Parser : IParser {
private Parser(string s) {
//Do something with s, probably store it in a field
}
public static IParser GetNewParser(string s) {
return new Parser(s);
}
}