Пятница, 29.03.2024, 12:56
Приветствую Вас Гость | RSS

Лекции

Меню сайта
Форма входа
Категории раздела
ТАУ (Теория автоматического управления) [31]
лекции по ТАУ
Экология [151]
учебник
Бухгалтерский учет и налогообложение в строительстве [56]
Дементьев А.Ю. - Практическое пособие
Психология [104]
Пип
информатика [80]
с# Карли Ватсон
современные стулья [0]
новинки
Поиск

Главная » 2010 » Февраль » 11 » Практический пример 2 - Менеджер рассылки новостей в режиме онлайн
00:59
Практический пример 2 - Менеджер рассылки новостей в режиме онлайн
Практический пример 2 -
Менеджер рассылки новостей
в режиме онлайн
Программа рассылки новостей
В предшествующих главах настоящей книги вы познакомились с тем, как про-
граммировать на языке С# и как использовать этот язык программирования
в приложениях Windows и простых приложениях ASP.NET. Теперь мы собираемся
продемонстрировать, каким образом можно использовать многое из того, с чем вы
познакомились, для создания web-приложения, которое может быть использовано
в реальном web-сайте .NET.
Ниже перечислены некоторые из тем, с которыми вы познакомитесь или кото-
рые вы сможете лучше усвоить в результате прочтения этого практического при-
мера:
• Создание законченных web-приложений с помощью ASP.NET
• Использование некоторых серверных управляющих элементов ASP.NET
для создания пользовательского интерфейса с богатыми возможностями
• Использование кода поддержки для разделения основного кода
от пользовательского интерфейса
• Создание файла web-конфигурации для хранения установок пользователя
для данного приложения и для обеспечения безопасности
базового уровня
• Использование объектно-ориентированных возможностей С#
для создания и применения классов, в которых инкапсулирована
бизнес-логика приложения -
• Использование некоторых классов .NET Framework
для работы с файлами, почтой и базами данных
• Запись в базу данных и чтение из базы данных с помощью
управляемого провайдера OLE DB и классов ADO.NET
• Распространение компилированных приложений ASP.NET
и их запуск через IIS
796 Практический пример
Общий обзор приложения
Любому web-мастеру известны ключевые элементы, необходимые для разра-
ботки успешного web-сайта. Вот некоторые из них:
• Хорошее наполнение (контент)
• Организация (удобство поиска и навигации)
• Привлекательный дизайн
• Взаимодействие с пользователем
Успешный web-сайт должен обладать свежим, регулярно обновляемым и инте-
ресным содержимым. Список адресов электронной почты может оказаться весьма
полезным для постоянного уведомления подписчиков о новых возможностях —
в качестве напоминания посетителям и стимула для регулярного посещения сайта.
Управление таким списком может представлять определенные трудности. Адми-
нистраторам приходится сопровождать список подписчиков, иметь дело с заявками
на подписку и с отказами от подписки, а также отслеживать все отправленные со-
общения.
Приложение, представляемое в настоящей главе, сможет оказать помощь в ав-
томатизации управления одним из таких списков. Эта программа — Менеджер
рассылки новостей в режиме онлайн — позволяет автоматизировать большую часть
задач, связанных с подпиской и управлением рассылкой новостей, а также упрос-
тить выполнение администратором остальных действий. Эта программа позволяет:
• Управлять множественными списками рассылок, давая администратору
возможность добавлять, исключать или вносить изменения
в списки и их свойства.
• Осуществлять управление подписчиками из всех списков
с возможностью задавать и изменять имя подписчика
и относящуюся к нему персональную информацию.
• Рассылать подписчикам сообщения по электронной почте в виде
обычного текста или в HTML-формате. Все электронные сообщения
могут автоматически снабжаться именем и адресом подписчика,
содержать ссылку, позволяющую произвести отказ от подписки,
а также любую другую информацию о списке (например, его название
. и описание).
• Управлять архивом новостей, рассылавшихся по всем спискам ранее,
предоставляя администратору возможность читать и копировать
предыдущие сообщения.
• Создавать HTML-форму, позволяющую получать данные пользователя
без необходимости писать какой бы то ни было код. Эта функциональная
возможность оформлена в виде программы-мастера — администратор
выбирает список, для которого ему требуется создать форму, задает
несколько опций, после чего мастер самостоятельно создает
весь необходимый код.
• Задавать некоторые опции, например, имя и адрес отправителя, подпись,
которая будет автоматически добавляться к каждому сообщению,
предмет сообщения по умолчанию, а также сообщения о подписке
и об отказе от подписки.
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 797
• Использовать возможность изменения внешнего представления
приложения (цвета и размеры шрифтов) без внесения изменения
в HTML-код или загрузки новых файлов.
Самым существенным преимуществом такого решения является то, что больше
не придется вручную управлять группой пользователей: приложение добавляет их
в базу данных и исключает их оттуда. Вторым, и также важным преимуществом
является то, что администратор получает возможность следить за подписчиками
web-сайта в режиме онлайн, общаться с ними и даже вносить изменения во внеш-
нее представление web-сайта из любой точки планеты. Все, что ему для этого тре-
буется,— это компьютер с web-браузером и выход в Интернет.
В данном примере предполагается, что для разработки приложения
вы будете использовать Visual Studio.NET. Если это не такг то в программе,
которую вы можете загрузить, содержатся указания как откомпилировать
это приложение из командной строки.
Модель приложения
Хорошие приложения, построенные на основе использования баз данных,
обычно разбиваются на уровни для представления, бизнес-логики и данных. Такая
модель упрощает сопровождение приложения, а также дает лучшую масштабируе-
мость, поскольку допускает установку приложения на различных серверах. Даже
если приложение, которое мы собираемся разрабатывать, не требует повышенной
масштабируемости, все равно это тот путь, по которому следует двигаться. Графи-
ческое представление структуры нашего приложения представлено на следующей
диаграмме:
Службы пользователя
Страницы ASP.NET
• -• t Ь - ' • : • • • ' : • ' • • ' • '
Т '. - . ' • • -'•• - : ': •'
Классы кода поддержки
(NewsMailer.dll)
/
/
Бизнес-службы
/
/
Модуль доступа
к базе данных
(NewsMailerDB.dll)
Модуль менеджера
конфигурации приложения
(NewsMailerConfig.dll)
Службы данных
Доступ к базе данных
(NewsMailer.mdb)
Файл конфигурации
(NewsMailer. Settings)
Уровень представления (службы пользователя) состоит из страниц ASP.NET
с их кодом поддержки (откомпилированным в модуль). Уровень бизнес-служб со-
держит в себе еще два модуля, которые обеспечивают простой доступ к данным.
Настоящий раздел посвящен подробному объяснению реализации каждого из этих
уровней и модулей.
798 Практический пример
Объекты данных и бизнес-объекты
NLesiwtsDsMBaelirDB.dl (ListsDB.cs)
(SuSbusbcsrcbibreiersrsDDBB.es)
—(NNewewsHsHsitsoitoryryDDBB.es)
NewsMailerConfig.dl
AAppppSCeotntinggfis
(AppConfig.es)
Мы начнем обсуждение с уровня данных
и бизнес-уровня. На диаграмме, приведенной
на рисунке слева, показаны два модуля бизнес-
уровня и общие классы, входящие в их состав.
Модуль NewsMaiierDB.dll обеспечивает до-
ступ к базе данных, в нем хранятся названия
списков рассылки, подписчики и предыдущие
Сообщения. Модуль NewsMailerConfig.dll
обеспечивает доступ к XML-файлу, в котором
хранятся установки и где все опции приложе-
ния могут считываться и изменяться.
Модель базы данных
В целом приложение основывается на использовании базы данных, поэтому
начнем обсуждение проекта с выбора и обсуждения модели базы данных. Мы ре-
шили использовать базу данных Access вместо SQL Server по целому ряду причин.
Базу данных Access проще конфигурировать, кроме того, ее наличие предусматри-
вается в большинстве планов по работе с web-серверами, в то время как наличие
SQL Server предусматривается только в наиболее сложных (и более дорогих) про-
ектах по использованию web-серверов. Кроме того, поскольку выигрыш от исполь-
зования менеджера рассылки новостей прежде всего получают небольшие web-
сайты, мы предпочли написать приложение, которое может быть использовано
всеми. Более того, использование SQL Server оправдано для широкомасштабных
сайтов, при обращении к которым многим пользователям одновременно требуется
установление соединения с базой данных. В нашем приложении регулярно уста-
навливать соединение с базой данных будет только администратор. Пользователям
потребуется соединение только для подписки или отказа от подписки, однако тако-
го рода операций выполняются очень быстро, и представляется маловероятным,
что очень большое количество пользователей решит подписаться одновременно.
Поэтому если вам не приходится работать с десятками тысяч подписчиков, база
данных Access является более адекватной. Тем не менее, по ходу обсуждения будет
сделано несколько кратких замечаний, как можно перенести базу данных на SQL
Server, чтобы воспользоваться ее мощью и скоростью. Совершенно очевидно, что
если некоторые части сайта уже используют базу данных SQL Server (например,
при разработке сайта электронной коммерции и использовании SQL Server для
хранения наименований продукции
и информации о ней), вам следует ин-
тегрировать в нее и менеджера рас-
сылки новостей, и все таблицы, с тем
чтобы избежать использования двух
разных баз данных.
Перейдем к обсуждению модели
базы данных. БД состоит из четырех
таблиц, которые связаны между собой
отношениями, изображенными на ри-
сунке справа.
Теперь мы переходим к подробному
описанию этих таблиц и их отношений.
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 799
Таблица Lists
Таблица Lists используется для хранения информации обо всех доступных спи-
сках рассылки и имеет следующую структуру:
Название
столбца
ID
Name
Description
Тип
AutoNumber
Text
Text
Размер
50
250
Допускается
значение null
Нет
Нет
Да
Описание
Уникальный идентификатор списка
рассылки
Имя списка рассылки
Необязательное описание списка
рассылки
Таблица UsersData
В таблице UsersData хранится персональная информация пользователей. Таб-
лица имеет следующую структуру:
Название
столбца Тип Размер
Допускается
значение null Описание
ID AutoNumber Нет
FirstName
LastName
Email
Text
Text
Text
50
50
50
Нет
Нет
Нет
Уникальный идентификатор
пользователя
Имя пользователя
Фамилия пользователя
Адрес электронной почты
пользователя
В данной таблице не содержится указания на то, к какому списку рассылки
приписан пользователь, поскольку один пользователь может подписаться сразу на
несколько различных списков. Наилучшая практика — избегать повторения одних
и тех же деталей. К этому мы вынуждены были бы прибегнуть, если бы решили
хранить подробную информацию о пользователях вместе с каждым из списков, на
которые они подписались. Размещение данных о пользователях в виде отдельной
таблицы позволяет не тратить места впустую, а если возникнет необходимость из-
менить какую-либо информацию о пользователе (скажем, при изменении адреса
электронной почты), то потребуется обновить только единственную запись для
всех списков рассылки, на которые этот пользователь подписан.
Таблица Subscribers
Таблица Subscribers в основном используется для хранения связей между спи-
ском и пользователем. В ней также хранится дата, когда пользователь первый раз
подписался на этот список. Данная таблица имеет следующую структуру:
Название
столбца Тип Размер
Допускается
значение null Описание
ID
ListID
AutoNumber
Integer
Нет
Нет
Уникальный идентификатор подписки
Идентификатор списка, на который
подписался пользователь
800
Название
столбца Тип Размер
Допускается
значение null
Практический пример
Продолжение таблицы
Описание
UserID
CreateDate
Integer
Date
Нет
Нет
Идентификатор пользователя,
который должен совпадать
с идентификатором пользователя
в таблице UserDataTable
Дата создания данной подписки
Таблица NewsHistory
Таблица NewsHistory используется для хранения предыдущих сообщений, от-
правленных подписчикам всех рассылочных списков, и имеет такую структуру:
Название
столбца Тип Размер
Допускается
значение null Описание
ID
ListID
Subject
Body
IsHTML
AutoNumber
Text
Text
Memo
Boolean
200
SentDate Date
Нет
Нет
Нет
Да
Нет
Нет
Уникальный идентификатор сообщения
Название списка рассылки, в соответствии
с которым рассылалось данное сообщение
Предмет сообщения
Тело сообщения
Если значение равно true, это означает,
что сообщение отправлялось
в HTML-формате
Дата отправки сообщения
Отношения между таблицами
Если вернуться немного назад и взглянуть на рисунок, на котором представле-
ны отношения между таблицами, то можно увидеть, что между таблицами Lists
И Subscribers И L i s t s И NewsHistory Существует отношение ОДИН КО МНОГИМ, так
как каждый список может иметь несколько подписчиков и несколько отправлен-
ных ранее сообщений. Аналогичным образом, один пользователь может подписать-
ся более чем на один список, поэтому отношение между таблицами usersData
и subscribers — также один ко многим.
Задать отношения между таблицами с помощью Access очень просто. Пройдем
эту процедуру последовательно, шаг за шагом. Откройте файл NewsMaiier.mdb
и выберите пункт меню Tools | Relations. Появится диалоговое окно, в котором на
переднем плане изображены четыре используемые таблицы, а на заднем — пустое
окно. Последовательно выберите и добавьте в это окно одну за другой все таблицы,
изображенные в первом диалоге, после чего закройте окно. Теперь в окне, которое
изображалось на заднем плане, выводятся все четыре таблицы, и можно присту-
пать к созданию отношений между ними. Сначала нужно привязать к таблице Lists
таблицу Subscribers. Щелкните мышью на поле ListiD таблицы subscribers, пе-
ренесите его в поле ID таблицы Lists и отпустите. Это приведет к появлению диа-
логового окна, изображенного на рисунке на стр. 801.
Два раскрывающихся списка в этом диалоговом окне позволяют выбирать
поля, между которыми устанавливаются отношения. Если была проведена опера-
ция переноса мышью, то необходимые поля уже являются выбранными, а описание,
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 801
ID
шдо
Subject
•siBrtTodMyL
3
a n s r .
• Г C«c*de Update Rel-зЫ Field* •
(7 Cascade Dd<*« Rented Records
J • 1
расположенное в нижней части диалога, гласит
"один ко многим", что означает, что один список
рассылки предназначается для множества под-
писчиков. Вместо операции переноса мышью
можно было щелкнуть мышью два раза на
основном окне (с таблицами), что привело бы
к переходу в то же диалоговое окно, но только
без наличия выбранных полей таблиц, между
которыми устанавливаются связи.
Прежде чем окончательно создать отношение,
требуется учесть еще один момент: необходи-
мость установки Referenda! Integrity (ссылочная
целостность) и включения Cascade Delete (кас-
кадное удаление), как это показано на рисунке.
Поступив таким образом, мы добьемся того, что
при удалении некоторого списка привязанные
к нему подписчики также будут автоматически
удалены. Есть еще опция Cascade Update (кас-
кадное обновление), которая гарантирует, что
все значения ListiD в таблице subscribers бу-
дут обновляться при изменении значений ID
в таблице Lists, однако нам такой режим не
требуется, поскольку поле ID имеет значение
типа AutoNumber, которое не может изменяться
после включения записи в таблицу.
Теперь нам следует создать отношения между таблицами Lists— NewsHistory
и subscribers—usersData аналогичным образом, определяя, между какими полями
должны быть установлены связи с помощью вышеприведенного рисунка.
Бизнес-классы, предназначенные
для доступа в базе данных
Код, который осуществляет работу с базами данных, логически и физически по-
дразделяется на несколько различных классов. Все эти классы будут откомпилиро-
ваны в библиотеку классов с именем NewsMaiierDB. Остальная часть кода —
классы кода поддержки приложения — будет помещена в отдельный модуль. Это
наилучший подход, ибо, если возникает необходимость внести какие-либо измене-
ния в работу базы данных или требуется установить новую версию SQL Server, для
этого будет нужно внести изменения и повторно откомпилировать только бизнес-
модуль. Это лучше, чем компилировать все вместе (бизнес-классы и класс под-
держки) в единый модуль, поскольку можно использовать бизнес-модуль само-
стоятельно, например, в клиентской части приложения Windows.
Для данного приложения такой подход не дает существенных преимуществ;
структура приложения является довольно простой, компилировать приходится не
такие уж большие файлы, и никакие другие клиенты эти бизнес-классы не исполь-
зуют. Поэтому, даже если мы все откомпилируем в единую DLL, это не приведет
к серьезным проблемам. Но мы будем использовать отдельные DLL-модули, для
того чтобы продемонстрировать, насколько все это просто, и для того, чтобы при-
учить вас к хорошим манерам
802 Практический пример
Если вы разрабатываете проект с нуля, вы должны посвятить все время, затра-
ченное на создание проекта, объектно-ориентированной разработке, для чего
обычно следует отделить бизнес-классы от кода пользовательского интерфейса
и компилировать их в разные библиотеки. Разбиение кода на несколько отдельных
модулей может быть осуществлено и позднее, поскольку это относится к процедуре
компиляции. Однако при этом необходимо создавать такие классы, единственная
задача которых — осуществлять взаимодействие с базой данных, размещая весь
код, ответственный за пользовательский интерфейс, в других классах.
Создание проекта
Если для разработки используется Visual Studio.NET, то следует создать новый
проект с типом С# | Class Library и назвать его NewsMaiierDB. Затем необходимо
приступить к созданию файлов классов для данного модуля, что будет объясняться
в следующих разделах. Необходимо создать новый файл для каждого класса с по-
мощью команды Project | Add New Class, либо с помощью Project | Add Existing Item,
если вы пожелаете импортировать готовые файлы с web-сайта издательства Wrox.
Обратите внимание на то, что код этих бизнес-классов воспроизводится
в тексте книги.
Класс ListsDB
Класс ListsDB предоставляет все функциональные возможности, необходимые
как для выполнения манипуляций над уже существующими списками рассылки, так
и для создания новых. Информация об этом классе сведена в следующую таблицу:
Класс ListsDB
Метод Описание
public ListsDB (string ConnString)
public DataSet GetListsO
public DataRow GetDetails(int ListID)
public bool Add (string ListName,
string listDescr)
public bool Delete (int ListID)
bool Update (int ListID, string ListName,
string listDescr)
Конструктор класса, которому в качестве параметра
передается строка соединения, описываемая в установках
файла (к их обсуждению мы перейдем позже)
Возвращает объект DataSet, в котором содержатся
все доступные списки новостей
Позволяет получать подробную информацию о списке
по заданному идентификатору
Добавляет новый список с заданным именем и описанием
Удаляет указанный список
Позволяет изменять свойства Name и Description
указанного списка
Метод GetListsO возвращает набор данных, в котором находится все содержи-
мое таблицы Lists, то есть все доступные списки и их свойства. Этот метод воз-
вращает единственный список, который задается идентификатором, передаваемым
методу в качестве параметра.
С помощью метода Delete о можно удалить запись с идентификатором, преда-
ваемым этому методу в качестве параметра. Почти так же работают методы Add о
и update о за исключением того, что параметры могут содержать еще и данные,
которые должны быть модифицированы или добавлены.
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 803
Класс SiibscribersDB
Класс SubscribersDB предназначается для доступа к таблицам subscribers
и usersData. Он обладает структурой, аналогичной структуре класса ListsDB,
и хранится в файле subscribers.cs. Все методы этого класса сведены в следую-
щую таблицу: s
Класс Subscribers
ЭВМетод Описание
public SubscribersDB (string ConnString)
public DataSet GetSubscribers(int ListID)
public DataRow GetDetails(int SubscrlD)
public bool Add(int ListID, string FirstName,
string LastName, string Email)
public bool Delete (int SubscrlD)
public bool Update (int SubscrlD, string FirstName,
string LastName, string Email)
public int GetUserID(int SubscrlD)
public int GetUserID(string Email)
public int GetSubscriberID(int ListID,
string Email)
Конструктор класса, которому в качестве
параметра передается строка соединения,
описываемая в установках файла
Возвращает список подписчиков данного списка
Позволяет получать подробную информацию
о списке по заданному идентификатору
Добавляет нового подписчика
Удаляет подписчика
Позволяет обновить подробную персональную
информацию о подписчике
Возвращает идентификатор пользователя
по заданному идентификатору подписки
Возвращает идентификатор пользователя
по заданному адресу электронной почты
Возвращает идентификатор подписчика
для конкретного списка и конкретного
пользователя, определяемый по уникальному
адресу электронной почты
Этот класс оказывается несколько более сложным, чем класс ListsDB, поскольку
ему приходится иметь дело с двумя таблицами и управлять отношениями между
ними. Функция GetSubscribers о возвращает всех подписчиков того списка, иден-
тификатор которого передан ему в качестве параметра. В нем используется
SQL-оператор, в котором содержится команда INNER JOIN, позволяющая получать
информацию сразу ИЗ двух таблиц — UsersData И Subscribers!
public DataSet GetSubsctibers (int ListID)
string sqlCmd = "SELECT FirstName, LastName, Email, ";
sqlCmd += "ListID, UserlD, CreatedDate, Subsctibers.ID FROM UsersData ";
sqlCmd += "INNER JOIN Subscribers ON UsersData.ID= Subsctibers.UserlD ";
sqlCmd += "WHERE Subscribers.ListID = * + ListID;
DataSet subsctibers = new DataSet();
OleDbConnection myConn = new OleDbConnection(connString) ;
OleDbDataAdapter myDAdp = new OleDbDataAdapter (sqlCmd, myConn) ;
myDAdp.Fill(subscribers, "Subscribers*);
return subscribers;
Метод GetDetaiisO практически полностью аналогичен соответствующему ме-
тоду класса ListsDB; отличие заключается в SQL-строке, которая у него такая же,
как приведенная выше.
804 Практический пример
МеТОДЫ Add(), D e l e t e () И Update () ПОЗВОЛЯЮТ ВСТаВЛЯТЬ, удаЛЯТЬ И МОДИфиЦИ-
ровать подписку пользователей в новые списки. Они выполняют эту работу не-
сколько по-другому, чем соответствующие методы класса ListsDB. Функция
Delete о сначала удаляет подписчика из указанного списка, а затем производит
проверку, включен ли данный пользователь в какие-либо другие списки. Если нет,
то информация о пользователе удаляется из таблицы usersData. Функция Add о не
только добавляет подписчика в указанный список, но и проверяет, не совпадает ли
переданный ей адрес электронной почты с каким-либо адресом, уже имеющимся
в таблице UsersData. Если нет, то делается предположение, что это новый пользо-
ватель, и он добавляется в таблицу. Для создаваемого приложения мы будем исхо-
дить из предположения, что каждое вхождение поля электронной почты представляет
уникального пользователя.
Далее приведены две перезагрузки метода GetuseriDO, которые предназнача-
ются для внутреннего использования методами Delete о и Add(). Первый вариант
принимает в качестве параметра идентификатор подписчика и возвращает иденти-
фикатор пользователя, привязанный к данной подписке; этот метод используется
внутри метода Delete (). Вторая перезагрузка принимает в качестве параметра
строку адреса электронной почты и возвращает идентификатор пользователя, при-
вязанный к данному адресу, если таковой существует; этот метод используется
внутри метода Add ().
Последняя функция данного класса — GetSubscriberiDO — возвращает иден-
тификатор подписчика определенного списка по указанному адресу электронной
почты. Эта функция используется методом Add(), чтобы определить, существует
ли уже пользователь, который осуществляет подписку на данный список, в табли-
це UsersData, ИЛИ нет.
Класс NewsHistoryDB
КлаСС NewsHistoryDB (который Хранится В файле NewsMailerDB.cs) ЯВЛЯеТСЯ
самым простым из всех; он состоит всего лишь из четырех методов и параметризо-
ванного конструктора метода, как показано в приведенной ниже таблице:
Класс NewsHistoryDB
Метод Описание
public NewsHistoryDB (string ConnString) Конструктор класса, которому в качестве параметра
передается строка соединения, которая описывается
в установках файла
public DataSet GetNews(int ListiD) Возвращает все наименования новостей
для указанного списка
public DataRow GetDetails (int NewslD) Позволяет получать строку, которая идентифицирует
указанную запись News
public bool Add (int List ID, string Subject, Добавляет подробную информацию о записи
string Body/ bool isHTML) c новостями в заданный список
public bool Delete (int NewslD) Удаляет указанную запись News
Компиляция модуля
Когда создание всех файлов завершено, можно откомпилировать модуль. Если
вы выполняли все действия в Visual Studio.NET, то ваш Solution Explorer должен
принять вид, изображенный на рисунке на стр. 805.
Практический пример 2 — Менеджер рассылки новостей в режиме онлайн 805
Solution EKpforer ~ NewsMaifet
' э
r*(I project)
й-
ЕЬ Й References
§1) AssernblyInfoDB.es
§g| ListsDB.cs
«3] NewsHistoryDB.es
|8] SubscribersDB.es
soiu- 1 Class Vii
Файл Assembiyinfo.es содержит множество всех атрибутов,
которые транслируются в модуль наряду с исходными файлами.
Этот файл создается Visual Studio.NET по умолчанию в момент
создания проекта. Мы не будем вносить в него какие бы то ни
было изменения. •
При этом в режиме Class
View должна выводиться
картинка, представленная на
рисунке справа.
Компиляция модуля за-
ключается в использовании
команды Build в VS.NET.
* 4 t >


Категория: информатика | Просмотров: 1859 | Добавил: basic | Рейтинг: 5.0/1
Всего комментариев: 1
1 cryptopages Gork  
0
Good day, colleagues!

База данных ресурсов криптовалютной тематике.
Содержит более 335 тысяч URL ссылок на сайты посвященные криптотематике:
криптовалюты, блокчейн проекты, ICO (АйСиО), крипто биржи, фин.тех. индустрии, венчурные фонды, бизнес-ангелы, частные инвесторы и инвест.фонды и иные тематические ресурсы.
База данных собрана для рассылки Ваших предложений используя формы контактной связи на сайтах, размещения ваших сообщений, получения качественной ссылочной массы, тематического трафика.
Используется со след. программами:
- GSA Website Contact submitter,
- GSA Search Engine Ranker,
- Xrumer 18 версия.

При сборе базы из выдачи поисковиков было применено более 4000 ключевых слов на английском и других языках.

- Список ссылок очищен от дублей, вы получаете УНИКАЛЬНЫЕ доменные имена.
- Новые ссылки добавляются ежемесячно.
- Сайты с использованием защиты Google Recaptcha v2 также входят в данную базу.
Соответственно трастовость ресурсов выше чем у обычных баз с блогами и гостевыми.
- Очистка списка производится каждый месяц, удаляются несуществующие и имеющий большой тайм-аут ссылки.
- База ссылок собиралась из различных поисковиков с применением софта по разгадыванию капчи: GSA Captcha Breaker и XEvil.

Хватит тратить время на поиск ресурсов которые позволят разместить ссылку, оставить сообщение.
Работайте с таргетированной базой, специально подготовленной для B2B, B2C взаимодействия.

http://guardlink.org/EH9Cl1

Ссылка на скачивание файла станет доступна после оплаты.


Contacts us:
viecartixa6724@yahoo.com


#tags, keywords: ICO, blockchain, crypto industry, ICO advisory, ICO airdrop, ICO bounty program

bitcoin what is pool hopping
ripple cryptocurrency news
cryptocurrency key terms
bitcoin mining gpu chart
bitcoin all time high
mendapatkan bitcoin gratis kaskus
invest in bitcoin or gold

Имя *:
Email *:
Код *:
Календарь
«  Февраль 2010  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

krutoto.ucoz.ru
Бесплатный конструктор сайтов - uCoz