65.9K
CodeProject 正在变化。 阅读更多。
Home

Web RSS 生成器 第一部分:为 ASP.NET 和 Silverlight 构建通用 XML 数据源

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2010 年 10 月 29 日

CPOL

3分钟阅读

viewsIcon

24364

对开源 Web RSS 生成器的描述

引言

Web RSS Builder 是一款用于使用 Web 和 Silverlight 界面管理 RSS 文件的开源应用程序。当您需要使用 Web 应用程序管理服务器上的 RSS 文件时,此应用程序非常有用。

该应用程序托管在 CodePlex 上,网址为 http://WebRSSBuilder.codeplex.com

这是三部分帖子的第一部分,将介绍此应用程序

为什么?

我开始着手这项工作,是因为有人要求我将一个开源的桌面应用程序改编成管理 RSS 文件,而且由于我在一家大公司工作,出于多种原因,我认为有必要转向 Web 应用程序。

  1. 获取反馈将需要很长时间,并且由于软件中没有嵌入更新机制,您每次更新都需要重新安装它,这对 IT 部门来说是个麻烦。
  2. 员工将需要对服务器上的文件拥有访问权限,这在安全方面并非真正的好主意。

要求

该应用程序非常简单!要求如下:

  1. 保留服务器上所有 RSS 文件的列表
  2. 将每个文件与特定角色关联
  3. 开发一个 Web 界面来管理 RSS 文件

应用程序架构

该应用程序将包含三个主要项目

  1. 核心项目:它将包含负责表示和控制 RSS 文件的绑定类。
  2. ASP.NET 项目:它将包含 ASP.NET Web 应用程序界面。
  3. Silverlight 项目:实际上是两个:客户端和服务器,它将包含 Silverlight 应用程序界面。

核心组件

该应用程序将使用模型-视图-控制器(MVC)设计模式及其在 Silverlight 中的变体模型-视图-视图模型(MVVM)。核心组件的主要职责是为 ASP.NET 和 Silverlight 使用的 RSS 文件提供通用数据源。

模型

RSS 文件的模型类是

  • RSSFeed:表示 RSS 文件,RSS Feed 实现 INotifyPropertyChanged 以便在数据发生任何更改时通知绑定对象,它还包含
    1. 属性:例如 Title、Category 等。
    2. RSS 项目
    3. c. 索引器
  • RSSItem:表示一个 RSS 项目,它也实现 INotifyPropertyChanged 以便在数据发生任何更改时通知 Feed 对象,它包含
    1. 属性:例如 AuthorDescriptionPubdata

控制器 (Controller)

控制器是负责读取和写入 RSS XML 文件的对象,由于这可以以多种方式完成,因此控制器被抽象为一个接口 IRSSFeedController。该接口定义了两个基本方法:加载和保存。

namespace WebRSSBuilder.Core
{
    public interface IRSSFeedController
    {
        RSSFeed LoadRss(string FileURI);
        void SaveFeed(RSSFeed Feed); 
    }
}

控制器可以有不同的实现方式

  1. 使用 XML DOM
  2. 使用 LINQ to XML
  3. 使用简单的流文本
  4. 或许还有其他方式...

在这个阶段,我提供了一个使用 LINQ to XML 的实现,通过 RSSFeedXLinqController 类。对于不熟悉 LINQ to XML 的人,我将简要介绍一下。

此类除了接口 LoadSave 方法外,还包含三个辅助方法:

  1. GetElement:接收一个 XElement,并在其中搜索特定的 XML 标签。
  2. GetAttribute:接收一个 XElement,并在其中搜索特定的 XML 属性。
  3. GenerateChannel:接收一个 Feed 文件并为其生成一个 XElement,代码具有自描述性,如果有人有任何疑问,请随时提出。
private string GetElement(XElement x, string ElementName)
{
   XElement Element = x.Element(ElementName);
   return (Element == null ? null : Element.Value.Trim());
}
private string GetAttribute(XElement x, string ElementName)
{
   string ElementValue = x.Element(channel).Attribute(ElementName).Value;
   return (ElementValue == null ? null : ElementValue.Trim());
} 
private XElement GenerateChannel(RSSFeed Feed)
{
    XElement Channel = new XElement("channel");
    #region Saving Properties
    if (Feed.Category != null)
         Channel.Add(new XElement("category", Feed.Category));
    if (Feed.CloudDomain != null)
     {
       Channel.Add(new XElement("cloud", new XAttribute("domain", Feed.CloudDomain),
                   new XAttribute("port", Feed.CloudPort),
                   new XAttribute("registerProcedure", Feed.CloudRegisterProcedure),
                   new XAttribute("protocol", Feed.CloudProtocol)
                   ));
      }
    if (Feed.Copyright != null)
       Channel.Add(new XElement("copyright", Feed.Copyright));
...

此类实现 IRSSFeedController

  1. LoadRss:此方法通过 GetElement 加载 Feed 属性,并通过 LoadItem 加载项目。
  2. SaveFeed:此方法使用 GenerateChannel 方法生成 XLinq 对象。
public RSSFeed LoadRss(string FileURI)
 {
   DateTime help;
   XElement root = XElement.Load(FileURI);
   RSSFeed Feed = new RSSFeed();
   XElement Channel = root.Element("channel");
   #region Loading properties
   Feed.FileName = FileURI;
   Feed.Title = GetElement(Channel, "title");
   ...
   #endregion
   IEnumerable<xelement> items = from el in Channel.Elements("item") select el;
   foreach (XElement item in items)
   {
     Feed.Items.Add(LoadItem(item));
   }
   return Feed;
}
private RSSItem LoadItem(XElement x)
{
  RSSItem item = new RSSItem();
  DateTime help;
  bool b;
  int i;
  item.Author = GetElement(x, "author");
  item.Category = GetElement(x, "category");
  item.Comments = GetElement(x, "comments");
  ...
  return item;
}

下一篇文章

在下一篇文章中,我们将介绍将使用我们在此处描述的内容绑定到 RSS 数据源的 ASP.NET 应用程序。

你喜欢这篇文章吗?

如果你喜欢,请投票支持它。:)

© . All rights reserved.