C # коллекция ссылок для хранения ссылочных типов - PullRequest
1 голос
/ 31 декабря 2010

Мне нравится реализовывать коллекцию (что-то вроде List<T>), которая будет содержать все моих объектов, которые я создал за весь жизненный цикл моего приложения, как если бы это был массив указателей в C ++.Идея состоит в том, что когда мой процесс запускается, я могу использовать центральную фабрику для создания всех объектов, а затем периодически проверять / аннулировать их состояние.По сути, я хочу убедиться, что мой процесс имеет дело только с действительными экземплярами, и я не получаю повторно информацию, которую уже извлек из базы данных.Таким образом, все мои объекты будут в основном в одном месте - моя коллекция.Крутая вещь, которую я могу сделать с этим, состоит в том, чтобы избежать вызовов базы данных, чтобы получить данные из базы данных, если я уже получил их (даже если я обновил их после получения, они все еще актуальны, если, конечно, какой-то другой процесс не обновил их, ночто другое беспокойство).Я не хочу больше звонить new Customer("James Thomas");, если я уже когда-то инициировал Джеймса Томаса.В настоящее время я получу несколько копий одного и того же объекта в домене приложения - некоторые из них не синхронизированы, а другие синхронизированы, и хотя я решаю эту проблему, используя поле timestamp на сервере MSSQL, я бы хотел сохранить только одну копию для каждого клиентав моем домене приложения (если возможно, процесс будет лучше).

Я не могу использовать обычные коллекции, такие как List или ArrayList, например, потому что я не могу передать параметры по их реальной локальной ссылке их существующим методам Add (), гдеЯ создаю их, используя ref, так что это не очень хорошо, я думаю.Итак, как это может быть реализовано / может ли оно быть реализовано вообще?Я думаю, что класс «связанный список» со всеми методами, работающими с параметрами ref & out, - это довольно быстро.Есть ли другой способ реализовать такую ​​коллекцию, как RefList<T>.Add(ref T obj)?

Итак, суть в следующем: я не хочу заново создавать объект, если я уже создал его ранее в течение всей жизни приложения, если я не решувоссоздать его явно (возможно, оно устарело или что-то в этом роде, поэтому мне нужно снова извлечь его из БД).Возможно, есть альтернативы?

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

Самый простой способ сделать то, что вы пытаетесь сделать, это создать оболочку, которая удерживает список. Эта обертка будет иметь метод add, который принимает ссылку ref. В добавлении он ищет значение в списке и создает его, когда не может найти значение. Или кеш

Но ... это утверждение заставит меня волноваться.

Я не хочу заново создавать объект, если Я уже создал это раньше во время весь срок службы приложения

Но, как указывает Раймонд Чен, Кэш с плохой политикой - это еще одно название утечки памяти . То, что вы описали, это кеш без политики

Чтобы исправить это, вам следует рассмотреть возможность использования для не-веб-приложения System.Runtime.Caching для 4.0 или для 3.5 и более ранних версий Блок кэширования библиотеки предприятия . Если это веб-приложение, вы можете использовать System.Web.Caching . Или, если вы должны свернуть свои собственные, по крайней мере, получить разумную политику в месте.

Все это, конечно, предполагает, что кэширование вашей базы данных недостаточно.

0 голосов
/ 31 декабря 2010

Использование Ioc избавит вас от множества ошибок и облегчит тестирование вашего приложения, а ваши модули будут менее связанными.Ioc производительность довольно хорошая.Я рекомендую вам использовать реализацию проекта Castle http://stw.castleproject.org/Windsor.MainPage.ashx

, может быть, вам понадобится день, чтобы изучить его, но это здорово.

...