Компоненты .NET
164ASP.NET --- Основы ASP.NET --- Компоненты .NET
Грамотно спроектированное веб-приложение, написанное для ASP.NET, будет включать отдельные компоненты, которые могут быть организованы в виде отдельных уровней данных и бизнес-логики. После создания такие компоненты можно без проблем использовать с любой веб-страницы ASP.NET.
Создать компонент можно двумя способами:
- Создать новый файл .cs в подкаталоге App_Code
ASP.NET автоматически компилирует любые файлы кода в этом каталоге и делает содержащиеся в них классы доступными для остальной части веб-приложения. При добавлении нового класса в Visual Studio всегда появляется приглашение создать каталог App_Code (если он не существует) и поместить файл в него.
У веб-приложений, создаваемых в Visual Studio с помощью модели веб-проектов, подкаталога App_Code не бывает. Добиться такого же результата для веб-проекта можно добавлением файла исходного кода в проект, чтобы система Visual Studio скомпилировала его как часть сборки веб-приложения.
- Создать новый проект библиотеки классов в Visual Studio
Все классы в таком проекте компилируются в DLL-сборку. Когда сборка готова, она может быть добавлена в веб-приложение выбором в меню Website (Веб-сайт) (или в меню Project (Проект), если используется модель проектной разработки) Visual Studio пункта Add Reference (Добавить ссылку). Этот шаг приводит к добавлению в файл web.config ссылки на данную сборку и копированию самой сборки в подкаталог Bin приложения.
Оба подхода дают один и тот же результат. Например, если вы пишете код для компонента базы данных, то сможете обращаться к нему таким же способом независимо от того, имеется ли скомпилированная сборка в каталоге Bin либо файл исходного кода в каталоге App_Code. Точно так же, если вы пользуетесь возможностями предварительной компиляции ASP.NET, оба варианта будут работать одинаково. (В противном случае вы увидите, что на выполнение первого запроса к приложению будет затрачено больше времени, чем при использовании подхода с App_Code, т.к. в его случае предпринимается дополнительный шаг компиляции.)
Хотя оба подхода имеют, по сути, одну и ту же основу, управлять ими с помощью кода нужно по-разному. Это особенно касается тех случаев, когда требуется многократно использовать компонент в нескольких приложениях (или даже в различных типах приложений .NET). Если вы применяете подход, связанный с App_Code, во многих веб-приложениях, будет вообще просто сделать небольшие видоизменения, получив множество различных версий одного и того же совместно используемого класса.
Кроме того, второй подход более практичен для построения крупномасштабных приложений командой разработчиков, когда под рукой необходимо иметь несколько разных частей веб-приложения, подготовленных и скомпилированных по отдельности. В силу этих причин подход с применением библиотеки классов всегда предпочтительнее для профессиональной работы.
Подкаталог App_Code должен применяться только для классов, которые тесно связаны с веб-приложением. Повторно используемые модули функциональности (такие как библиотеки бизнес-логики, компоненты базы данных, процедуры проверки достоверности, утилиты шифрования и т.д.) должны всегда строиться в виде отдельных библиотек классов.
Создание компонента
В следующем примере демонстрируется простой компонент, который считывает случайно выбранную цитату Шерлока Холмса из XML-файла. (Этот XML-файл доступен в Интернете, его можно загрузить по ссылке - sherlock-holmes.xml).
Компонент состоит из двух классов: Quotation, который представляет единственную цитату, и SherlockQuotes, который позволяет считывать случайную цитату. Оба эти класса находятся в пространстве имен SherlockLib.
В первом примере кода показан класс SherlockQuotes, который во время создания его экземпляра загружает XML-файл, содержащий цитаты на языке QEL (Quotation Exchange Language — язык обмена цитатами). Класс SherlockQuotes имеет общедоступный метод GetRandom(), который может использоваться в коде веб-страницы:
using System;
using System.Xml;
namespace SherlockLib
{
public class SherlockQuotes
{
private XmlDocument quoteDoc;
private int quoteCount;
public SherlockQuotes(string fileName)
{
quoteDoc = new XmlDocument();
quoteDoc.Load(fileName);
quoteCount = quoteDoc.DocumentElement.ChildNodes.Count;
}
public Quotation GetRandomQuote()
{
int i;
Random x = new Random();
i = x.Next(quoteCount-1);
return new Quotation( quoteDoc.DocumentElement.ChildNodes[i] );
}
}
}
Каждая получаемая случайная цитата сохраняется в объекте Quotation. Вот как выглядит класс Quotation:
using System;
using System.Xml;
namespace SherlockLib
{
public class Quotation
{
private string qsource;
private string date;
private string quotation;
public Quotation(XmlNode quoteNode)
{
if ( (quoteNode.SelectSingleNode("source")) != null)
qsource = quoteNode.SelectSingleNode("source").InnerText;
if ( (quoteNode.Attributes.GetNamedItem("date")) != null)
date = quoteNode.Attributes.GetNamedItem("date").Value;
quotation = quoteNode.FirstChild.InnerText;
}
public string Source
{
get {return qsource;}
set {qsource = value;}
}
public string Date
{
get { return date; }
set { date = value; }
}
public string QuotationText
{
get { return quotation; }
set { quotation = value; }
}
}
}
Использование компонента через каталог App_Code
Самый простой способ быстро протестировать этот класс заключается в том, чтобы скопировать файлы исходного кода в подкаталог App_Code веб-приложения. Это можно сделать в проводнике Windows или воспользоваться Visual Studio (выбрав в меню Website (веб-сайт) пункт Add Existing Item (Добавить существующий элемент)).
Теперь можно импортировать пространство имен SherlockLib в веб-страницу, чтобы упростить доступ к этим классам:
using SherlockLib;
Наконец, этот класс можно использовать в коде веб-страницы подобного любому классу из .NET Framework. Ниже приведен пример кода, который отображает информацию о цитате на веб-странице:
protected void Page_Load(object sender, EventArgs e)
{
SherlockQuotes quotes = new SherlockQuotes(Server.MapPath("./sherlock-holmes.xml"));
Quotation quote = quotes.GetRandomQuote();
Response.Write("<b>" + quote.Source + "</b> (<i>" + quote.Date + "</i>)");
Response.Write("<blockquote>" + quote.QuotationText + "</blockquote>");
}
Если вы запустите это приложение, то результат будет таким, как показано на рисунке. После каждого обновления страницы отображается другая цитата.
Подход с применением каталога App_Code имеет еще одно ограничение — использовать разрешается только один язык. Это ограничение является следствием способа, которым ASP.NET выполняет динамическую компиляцию. По сути, все классы в каталоге App_Code компилируются в единственный файл, так что смешивать языки C# и VB нельзя.
Использование компонента через каталог Bin
Если необходимо, чтобы компонент предоставлял значительный объем функциональности и допускал возможность многократного использования в других приложениях, его лучше создавать с помощью отдельного проекта. В этом случае его можно будет применять, тестировать и создавать новые версии отдельно от исходного веб-приложения.
Чтобы построить отдельный компонент, нужно в Visual Studio создать проект библиотеки классов. Хотя такой проект можно создать с использованием отдельного экземпляра Visual Studio, для целей отладки часто проще загружать проект библиотеки классов и веб-приложение в единственное решение Visual Studio. Это позволяет легко модифицировать одновременно код веб-приложения и код компонента, а также за один шаг переходить от обработчика событий в веб-странице к методу в компоненте.
Чтобы воспользоваться таким подходом, сначала создайте веб-приложение. Затем выберите в меню File (Файл) пункт Add --> New Project (Добавить --> Новый проект), чтобы открыть диалоговое окно Add New Project (Добавить новый проект). В списке слева выберите группу шаблонов Visual C# и щелкните на шаблоне Class Library (Библиотека классов):
После добавления в проект библиотеки классов необходимого кода можно скомпилировать компонент, щелкнув правой кнопкой мыши на этом проекте в окне Solution Explorer (Проводник решений) и выбрав в контекстном меню пункт Build (Скомпоновать). В результате будет сгенерирована DLL-сборка, содержащая все классы данного компонента.
Чтобы позволить веб-приложению использовать этот компонент, необходимо добавить в проект веб-приложения ссылку на эту сборку. Это даст возможность Visual Studio предоставить свои обычные средства, такие как проверка синтаксиса и IntelliSense. В противном случае Visual Studio будет интерпретировать все попытки использовать этот класс как ошибки и откажется компилировать код.
Чтобы добавить ссылку, выберите в меню Website (веб-сайт) (или в меню Project (проект), если разрабатывается веб-проект) пункт Add Reference (Добавить ссылку). Откроется диалоговое окно Add Reference (Добавление ссылки) с несколькими вкладками, краткое описание которых приведено ниже:
- .NET
Эта вкладка позволяет добавлять ссылку в сборку .NET. Для выбора предлагается список хорошо известных сборок, хранящийся в реестре. Обычно эта вкладка применяется для добавления ссылки на сборку, которая является частью .NET Framework.
- СОМ
Эта вкладка позволяет добавлять ссылку на устаревший компонент СОМ. Для выбора предлагается список совместно используемых компонентов, установленных в системном каталоге Windows. При добавлении ссылки на СОМ-компонент .NET автоматически создает промежуточный интерфейсный класс, который называется сборкой взаимодействия (interop assembly). Такая сборка используется в коде для взаимодействия с унаследованным компонентом.
- Projects
Эта вкладка позволяет добавлять ссылку на проект библиотеки классов .NET, который на данный момент загружен в Visual Studio. На этой вкладке Visual Studio автоматически показывает список подходящих проектов. Зачастую именно этот способ является самым простым для добавления ссылки на собственные специальные компоненты.
- Browse
Эта вкладка позволяет находить файл скомпилированной сборки .NET (или компонента СОМ) на компьютере. Такой подход удобно применять для тестирования специальных компонентов, если не окажется исходного проекта или если вы не хотите загружать его в Visual Studio, опасаясь случайно изменить.
- Recent
Эта вкладка позволяет добавлять ссылку в одну из компилированных сборок .NET, которые использовались недавно (избавляя от необходимости заново выполнять поиск нужной сборки).
На рисунке ниже показан способ добавления ссылки на загруженный в данный момент проект:
После добавления ссылки соответствующий файл DLL-библиотеки автоматически копируется в каталог Bin текущего проекта. В этом можно удостовериться с помощью свойства Path ссылки в окне Properties (Свойства) или просто просмотрев каталог в проводнике. Важно отметить, что этот файл будет автоматически перезаписываться самой последней скомпилированной версией сборки при каждом запуске веб-приложения.
Все в действительности настолько просто. Чтобы использовать другой компонент (из собственного уровня бизнес-логики, от сторонних разработчиков или откуда-то еще), то все, что потребуется сделать — это добавить ссылку на интересующую сборку. Вдобавок ASP.NET позволяет использовать сборки со специальными элементами управления, причем так же просто, как и сборки со специальными компонентами. Это дает возможность помещать многократно используемый вывод и функциональность пользовательского интерфейса в отдельные пакеты, которые можно применять снова и снова внутри как одного и того же, так и множества разных приложений.