Приложение ASP.NET + C # + XML в виде архитектуры TransferLayer, DataLayer, BusinessLayer и UserInterface - PullRequest
0 голосов
/ 13 октября 2011

Я работал 1 неделю назад в компании, которая создает продукты САПР.

Во время обучения (несколько дней) я изучал язык C # и ASP.NET.

Вчера я получил приложение с архитектурой TL, DL, BL и UI от менеджера проекта.

У меня есть XML-файл вроде:

<parent>
<Categories name="something1">
<link url="link1" name="name1" description="descr1"/>
<link url="link2" name="name2" description="descr2"/>
...
</Categories>
<Categories name="something2">
<link url="link1" name="name11" description="descr11"/>
<link url="link2" name="name21" description="descr21"/>
...
</Categories>
...
</parent>

После этого руководитель проекта объяснил мне, как извлекать информацию XML (категории и ссылки) с использованием архитектуры TL, DL, BL и UI. Но я не понимаю, хорошо.

Я сделаю краткое изложение того, что я понял. Он сказал (P.Manager), что в TransferLayer мне нужно создать два класса: один для ссылок и другой для категорий. Итак, в классе Link я буду использовать setter и getter. Я написал так в C #:

public class Links
{
   private string url_link;
   private string name_link;
   private string desc_link;

   public string Url_Linkz
   {
   get { return url_link;}
   set { url_link = value;}
   }

   public string Name_Linkz
   {
   get { return name_link;}
   set { name_link = value;}
   }

   public string Descr_Linkz
   {
   get { return descr_link;}
   set { descr_link = value;}
   }
}

Хорошо, пока здесь (я надеюсь, что я написал правильно). Теперь он рассказал мне о классе Categories, который имеет свойство Name (с сеттером и геттером) и List of links (этот объект для каждой ссылки, здесь я не знаю, как), который берется из класса Link.

В DataLayer, в классе UrlStorage, мне нужно взять список категорий из класса Categories.

Будьте осторожны, на уровне TL и DL я не должен использовать функцию XML или какую-либо операцию над файлом XML.

в слое BL я буду использовать методы, которые работают с файлом XML (добавить узел, удалить узел и т. Д.) И получить список категорий.

в пользовательском интерфейсе я реализую объект TreeView для отображения категорий с их ссылками.

Мне не нужен другой код, но мне нужен законченный проект, который имеет все четыре уровня архитектуры, чтобы лучше понять. Нет определений, только примеры, потому что я пойму лучше с примерами Конечно, я создам еще несколько примеров, чтобы знать очень хорошо.

Большое спасибо за ваше время.

1 Ответ

0 голосов
/ 14 октября 2011

TL (уровень передачи) будет содержать так называемые DTO (объекты передачи данных). Цель DTO - предоставить простой способ передачи данных из одной системы (или уровня) в другую. В вашем случае упомянутые вами классы Link и Categories будут рассматриваться как DTO (потенциально называемые LinkDto и CategoriesDto). Они несут ответственность за хранение данных при переходе в BL и обратно (бизнес-уровень или уровень данных в других случаях).

Вот пример ваших классов DTO, чтобы вы начали (это не на 100% правильно).

public class LinkDto
{
    [XmlAttribute("url")]
    public string Url { get; set; }

    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlAttribute("description")]
    public string Description { get; set; }
}

public class CategoryDto
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("link")]
    public List<Link> Links { get; set; }
}

На этом этапе я бы предложил немного почитать XmlSerialization . Это один метод, который вы можете использовать для чтения / сохранения XML-файлов в .NET и из.

Как только классы DTO настроены правильно, классы бизнес-уровня, как правило, будут их каким-то образом потреблять.

Редактировать: перемещение Dto загружено в уровень данных, заменено вызовом уровня данных

namespace BusinessLayer
{
     public class Category
    {
         public string Name { get; set; }
         public List<Link> Links { get; set; }

         public static Category GetAll()
         {
             return DataLayer.GetAllCategories();
         }
    }  

    public class Link
    {
        public string Url { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }    

}

UPDATE В соответствии с вашими требованиями ваша логика сериализации и методы Load, показанные выше, могут быть перенесены на ваш уровень данных. Вот пример того, что вы можете использовать для сериализации:

public static string Serialize<t>(t obj)
{
    using (StringWriter writer = new StringWriter())
    {
        XmlSerializer formatter = new XmlSerializer(typeof(t));
        formatter.Serialize(writer, obj);

        return writer.ToString();
    }
}

public static t Deserialize<t>(string xml)
{
    using (StringReader reader = new StringReader(xml))
    {
        XmlSerializer formatter = new XmlSerializer(typeof(t));
        return (t)formatter.Deserialize(reader);
    }
}

В вашем пользовательском интерфейсе вы будете взаимодействовать исключительно с бизнес-уровнем. Вот почему метод GetAll представлен в классе Category. Поскольку ваши данные не выглядят иерархическими, я бы не рекомендовал элемент управления TreeView, а скорее набор вложенных повторителей.

 <asp:Repeater runat="server" ID="rptCategories" OnItemDataBound="rptCategories_ItemDatabound">
        <ItemTemplate>
            <h2>Category: <%#Eval("Name") %></h2>
            <asp:Repeater runat="server" ID="rptLinks">
                <ItemTemplate>
                    <a href="<%#Eval("url") %>" title="<%#Eval("Description") %>"><%#Eval("Name") %></a>
                </ItemTemplate>
            </asp:Repeater>
        </ItemTemplate>
    </asp:Repeater>

С кодом, похожим на:

protected void Page_Load(object sender, EventArgs e)
{

    if (!Page.IsPostBack)
    {
        rptCategories.DataSource = Category.GetAll();
        rptCategories.DataBind();
    }

}

protected void rptCategories_ItemDatabound(object sender, RepeaterItemEventArgs e)
{

    if (e.Item.ItemType == ListItemType.Item) {

        var repeater = (Repeater)e.Item.FindControl("rptLinks");
        var category = (Category)e.Item.DataItem;

        repeater.DataSource = category.Links;
        repeater.DataBind();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...