2010-12-31 6 views
1

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

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

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

+1

Вы когда-нибудь слышали о контейнере Ioc? –

+1

Что вы подразумеваете под «реальной местной ссылкой»? Вы недопонимаете и злоупотребляете 'ref' и' out', IMO. –

+0

Добавление объектов в коллекцию фактически хранит ссылки на объект. Я не вижу, что проблема с использованием списка . Не могли бы вы объяснить немного больше. –

ответ

3

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

Но ... это заявление заставит меня беспокоиться.

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

Но, как Raymond Chen указует, что A cache with a bad policy is another name for a memory leak. То, что вы описали это кэш, без политики

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

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

0

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

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

+0

Контейнеры IOC могут быть полезны, но я не совсем уверен, как они относятся к этому вопросу. –

+0

Парень хочет управлять всеми существующими экземплярами в системе. что может быть больше связано? –

Смежные вопросы