数据处理与存储:按需加载、XML操作及客户端存储策略
立即解锁
发布时间: 2025-08-25 01:57:26 阅读量: 21 订阅数: 24 AIGC 


Silverlight 4快速开发指南
### 数据处理与存储:按需加载、XML 操作及客户端存储策略
#### 1. 按需加载(懒加载)
按需加载是一种在应用程序需要对象时,通过向数据源为每个对象单独发送查询请求来加载对象的机制。其主要目标是仅在绝对必要时加载和实例化对象,从而合理分配内存资源。当需要加载少量实体的数据且数据量较大时,这种方法非常适用。
要实现按需加载,`DataServiceContext` 类提供了 `BeginLoadProperty` 方法,该方法遵循异步模型,需要指定源实体、属性名称和回调函数。其方法签名如下:
```csharp
public IAsyncResult BeginLoadProperty(
Object entity,
string propertyName,
AsyncCallback callback,
Object state
)
```
在示例中,可以在 `BookDataGrid SelectionChanged` 方法中添加以下代码来实现按需加载:
```csharp
//Explicit loading (Lazy loading) using BeginLoadPropety
context.BeginLoadProperty(currentBook , "BookDetails", PropertyLoadCompleted, null);
```
回调方法 `PropertyLoadCompleted` 如下:
```csharp
private void PropertyLoadCompleted(IAsyncResult result)
{
context.EndLoadProperty(result);
//Getting reference to current selected book
Book currentBook = BookDataGrid.SelectedItem as Book;
if (currentBook == null) return;
var query = (from bd in currentBook.BookDetails select bd);
BookDetailsDataGrid.ItemsSource = query.ToList();
}
```
调用 `EndLoadProperty` 后,属性将正确加载相关实体,这样就可以通过导航属性 `BookDetails` 访问相关实体 `BookDetail` 并绑定到 `BookDetailsDataGrid` 控件。
#### 2. 处理 XML 数据
数据可以通过多种方式检索并直接连接到用户界面,例如通过 `WebClient` 或 `HttpWebRequest/Response` 直接下载,或者从 Web 服务调用返回。以下是一个使用 Microsoft Bing Web 服务进行简单 Web 搜索的示例:
```xml
<ListBox Grid.Row="3" x:Name="resultsListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock FontFamily="Arial" Text="{Binding Title}"/>
<TextBlock FontSize="10" Text="{Binding Url}"/>
<TextBlock Text="{Binding Description}"
FontSize="10" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
```
调用 Web 服务的代码如下:
```csharp
MSNSearchPortTypeClient client = new MSNSearchPortTypeClient();
client.SearchCompleted += new
EventHandler<SearchCompletedEventArgs>
(client SearchCompleted);
SearchRequest req = new SearchRequest();
SourceRequest[] sourceReq = new SourceRequest[1];
sourceReq[0] = new SourceRequest();
sourceReq[0].Source = SourceType.Web;
req.Query = searchTerms.Text;
req.Requests = sourceReq;
req.AppID = /* enter your AppID here!! */
req.CultureInfo = "en-US";
client.SearchAsync(req);
```
异步回调代码如下:
```csharp
resultsListBox.ItemsSource = e.Result.Responses[0].Results;
```
这表明将 Web 服务返回的数据连接到用户界面非常容易。Silverlight 中的服务基础结构会处理数据的序列化和反序列化,使应用程序可以专注于作为数据源的对象。此外,Silverlight 还提供了丰富的 XML 类用于读取、写入和处理 XML 文件,并且从版本 3 开始支持 LINQ。
#### 3. 解析 XML
`System.Xml.XmlReader` 类可以从多种源(如流或字符串)解析 XML 文档,还可以直接访问 XAP 文件中的 XML 文件。可以通过 `XmlReader.Create` 方法的多个重载来处理 XML 文件。以下是一个解析 `WebDeveloper` 类 XML 文件的示例:
```xml
<?xml version="1.0" encoding="utf-8" ?>
<WebDevelopers>
<WebDeveloper>
<FirstName>Ashish</FirstName>
<LastName>Ghoda</LastName>
<Email>[email protected]</Email>
<Website>www.TechnologyOpinion.com</Website>
</WebDeveloper>
<WebDeveloper>
<FirstName>Jay</FirstName>
<LastName>Nanavaty</LastName>
<Email>[email protected]</Email>
<Website>www.TechnologyOpinion.com</Website>
</WebDeveloper>
</WebDevelopers>
```
使用 `XmlReaderSettings` 配置 `XmlReader` 的行为,这里指示 `XmlReader` 忽略空白:
```csharp
List<WebDeveloper> WebDevelopers = new List< WebDeveloper>();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
XmlReader xmlReader = XmlReader.Create("WebDevelopers.xml", settings);
while (xmlReader.ReadToFollowing("WebDeveloper"))
{
WebDeveloper wd = new WebDeveloper();
xmlReader.ReadToDescendant("FirstName");
wd.FirstName = xmlReader.
ReadElementContentAsString("FirstName","");
wd.LastName = xmlReader.
ReadElementContentAsString ("LastName","");
wd.Email = xmlReader.ReadElementContentAsString ("Email
```
0
0
复制全文
相关推荐










