Подожду пока "критиканы" (кстати, мною уважаемые люди, и если кто-то из них обидится на это название, пусть скажет, буду ее вычищать из текста) критикуют и промоют мне мозги по поводу:
- правильности и способа написания use-case,
- определения целей пользователя,
- value-пользователя (ну... это типа подцель или, по другому, какая-то нужная пользователю штука, позволяющая достичь цели),
- и (поверьте) многого другого.
(сегодня был первый день, когда я достиг целей блога, т.е.когда мне с двух сторон приводили доводы и контр-доводы одного и другого и третье и десятого... по поводу описания use-case и требований к сайту.... боюсь я стока сразу усвоить не могу)
Ну так вот, я решил начать описывать структуру БД и пр.
Начнем со структуры базы данных новостей:

Во-от....
Реализация кода:
Если покликать на участках кода в FireFox и IE - код скрывается. (на моих версиях)
Итак! Что бы реализовать работу с Новостями был реализован следующий behind-код. Т.е. тут не приведены файлы представления данных.
Контроллер, обслуживающий новости:
NewsController.cs
* This source code was highlighted with Source Code Highlighter.
- using System;
- using System.Web.Mvc;
- using System.Collections;
- using System.Collections.Specialized;
- using NH = VeloLife.NhProxy;
- using VeloLife.Models;
- using VeloLife.Environment;
- using VeloLife.Security;
- namespace VeloLife.Controllers
- {
- /// <summary>
- /// Контроллер "Новостей"
- /// </summary>
- public class NewsController : MyBaseController
- {
- /// <summary>
- /// Отобразить список новостей.
- /// </summary>
- /// <returns></returns>
- public ActionResult List()
- {
- IList result = NH.News.GetActualNewses();
- ViewData["News"] = result;
- return View();
- }
- /// <summary>
- /// Отредактировать новость с ID...
- /// </summary>
- /// <returns></returns>
- [ExternalSecutityCheckAspect(Permission=SecurityContext.PermissionLevel.Administrator)]
- public ActionResult Edit()
- {
- string id = RouteData.Values["id"].ToString().ToLower();
- News news = new News();
- if (id == "")
- {
- news.DateNews = DateTime.Now;
- }
- else
- {
- news.Load(id);
- }
- ViewData["Object"] = news;
- return View();
- }
- /// <summary>
- /// Сохранить новость.
- /// </summary>
- /// <returns></returns>
- [ExternalSecutityCheckAspect(Permission = SecurityContext.PermissionLevel.Administrator)]
- public ActionResult Save()
- {
- News news = new News();
- NameValueCollection param = this.Request.Params;
- try
- {
- if (param["IdNews"] != "" && param["IdNews"] != "-1")
- {
- news.IdNews = Int32.Parse(param["IdNews"]);
- }
- if (param["DateNews"] == "")
- {
- this.Errors.Add("Не определена дата");
- }
- else
- {
- news.DateNews = DateTime.Parse(param["DateNews"]);
- }
- if (param["CaptionNews"] == "")
- {
- this.Errors.Add("Не определен заголовок");
- }
- else
- {
- news.CaptionNews = param["CaptionNews"];
- }
- if (param["TextNews"] == "")
- {
- this.Errors.Add("Не определено тело новости");
- }
- else
- {
- news.TextNews = param["TextNews"];
- }
- }
- catch (Exception e)
- {
- this.Errors.Add("Системная ошибка: " + e.Message);
- }
- if (!this.Errors.HasErrors)
- {
- news.Save();
- return null;
- }
- return View("SimpleMessage");
- // return this.RedirectToAction("SimpleMessage", "Main", new { VLServerErrors = this.Errors });
- }
- /// <summary>
- /// Спец метод завершения работы с новостями.
- /// Зачем сделал - плохо помню :)
- /// </summary>
- /// <returns></returns>
- [ExternalSecutityCheckAspect(Permission = SecurityContext.PermissionLevel.Administrator)]
- public ActionResult Done()
- {
- return RedirectToAction("List", "News");
- }
- }
- }
Автогенереная часть модели:
Model/News.TG.cs
* This source code was highlighted with Source Code Highlighter.
- using System;
- using NH = VeloLife.NhProxy;
- namespace VeloLife.Models
- {
- public partial class News
- {
- #region Поля
- ///<summary>
- ///Ид новости
- ///</summary>
- private int _IdNews;
- ///<summary>
- ///Дата новости
- ///</summary>
- private DateTime _DateNews;
- ///<summary>
- ///Заголовок новости
- ///</summary>
- private string _CaptionNews;
- ///<summary>
- ///Текст новости
- ///</summary>
- private string _TextNews;
- #endregion
- #region Свойства доступа к полям
- ///<summary>
- ///Обработка Ид новости
- ///</summary>
- public int IdNews
- {
- get
- {
- return _IdNews;
- }
- set
- {
- _IdNews = value;
- }
- }
- ///<summary>
- ///Обработка Дата новости
- ///</summary>
- public DateTime DateNews
- {
- get
- {
- return _DateNews;
- }
- set
- {
- _DateNews = value;
- }
- }
- ///<summary>
- ///Обработка Заголовок новости
- ///</summary>
- public string CaptionNews
- {
- get
- {
- return _CaptionNews;
- }
- set
- {
- _CaptionNews = value;
- }
- }
- ///<summary>
- ///Обработка Текст новости
- ///</summary>
- public string TextNews
- {
- get
- {
- return _TextNews;
- }
- set
- {
- _TextNews = value;
- }
- }
- #endregion
- #region Вспомогательные методы по объекту.
- ///<summary>
- ///Загрузка объекта
- ///</summary>
- public void Load(int id)
- {
- using (NH.News db = new NH.News(this))
- {
- db.Load(id);
- }
- }
- ///<summary>
- ///Загрузка объекта по ID в виде строки.
- ///часто будет нужна при работе с controller.
- ///</summary>
- public void Load(string id)
- {
- using (NH.News db = new NH.News(this))
- {
- db.Load(Int32.Parse(id));
- }
- }
- ///<summary>
- ///Загрузка объекта
- ///</summary>
- public void Save()
- {
- using (NH.News db = new NH.News(this))
- {
- db.Save();
- }
- }
- #endregion
- }
- }
Custom-реализация модели:
Model/News.Custom.cs
* This source code was highlighted with Source Code Highlighter.
- using System.Collections;
- using NH = VeloLife.NhProxy;
- namespace VeloLife.Models
- {
- public partial class News
- {
- public News()
- {
- _IdNews = -1;
- }
- public static IList GetActualNewses()
- {
- return NH.News.GetActualNewses();
- }
- }
- }
Автогенереная прокси для Nhibernate:
NhProxy/News.TG.cs
* This source code was highlighted with Source Code Highlighter.
- using System;
- using M = VeloLife.Models;
- using NHibernate;
- using System.Collections;
- namespace VeloLife.NhProxy
- {
- public partial class News : IDisposable
- {
- ///<summary>
- ///Ссылка на реальный объект
- ///</summary>
- private M.News _realObject;
- ///<summary>
- ///Ид новости
- ///</summary>
- private int _IdNews;
- ///<summary>
- ///Дата новости
- ///</summary>
- private DateTime _DateNews;
- ///<summary>
- ///Заголовок новости
- ///</summary>
- private string _CaptionNews;
- ///<summary>
- ///Текст новости
- ///</summary>
- private string _TextNews;
- public News()
- {
- _realObject = null;
- }
- public News(M.News realObject)
- {
- _realObject = realObject;
- IdNews = _realObject.IdNews;
- DateNews = _realObject.DateNews;
- CaptionNews = _realObject.CaptionNews;
- TextNews = _realObject.TextNews;
- }
- #region Свойства доступа к полям
- ///<summary>
- ///Обработка Ид новости
- ///</summary>
- public virtual int IdNews
- {
- get
- {
- return _IdNews;
- }
- set
- {
- _IdNews = value;
- }
- }
- ///<summary>
- ///Обработка Дата новости
- ///</summary>
- public virtual DateTime DateNews
- {
- get
- {
- return _DateNews;
- }
- set
- {
- _DateNews = value;
- }
- }
- ///<summary>
- ///Обработка Заголовок новости
- ///</summary>
- public virtual string CaptionNews
- {
- get
- {
- return _CaptionNews;
- }
- set
- {
- _CaptionNews = value;
- }
- }
- ///<summary>
- ///Обработка Текст новости
- ///</summary>
- public virtual string TextNews
- {
- get
- {
- return _TextNews;
- }
- set
- {
- _TextNews = value;
- }
- }
- private void FillRealObject()
- {
- _realObject.IdNews = IdNews;
- _realObject.DateNews = DateNews;
- _realObject.CaptionNews = CaptionNews;
- _realObject.TextNews = TextNews;
- }
- #endregion
- ///<summary>
- ///Загрузка данных по ИД
- ///</summary>
- public virtual void Load(int id)
- {
- ISession session = NHibernateStorage.GetCurrentSession();
- session.Load(this, id);
- NHibernateStorage.CloseSession();
- FillRealObject();
- }
- ///<summary>
- ///Сохранение данных.
- ///</summary>
- public virtual void Save()
- {
- ISession session =null;
- try
- {
- session = NHibernateStorage.GetCurrentSession();
- }
- catch (Exception e)
- {
- throw e;
- }
- ITransaction tx = session.BeginTransaction();
- if (this.IsNew)
- {
- session.Save(this);
- }
- else
- {
- session.Update(this);
- }
- tx.Commit();
- NHibernateStorage.CloseSession();
- }
- ///<summary>
- ///Проверяет, является ли объект новым.
- ///</summary>
- protected virtual bool IsNew
- {
- get
- {
- return _realObject.IdNews == -1;
- }
- }
- public virtual void Dispose()
- {
- }
- }
- }
Custom-часть прокси для Nhibernate:
NhProxy/News.Custom.cs
* This source code was highlighted with Source Code Highlighter.
- using System;
- using System.Collections;
- using NHibernate;
- namespace VeloLife.NhProxy
- {
- public partial class News
- {
- public static IList GetActualNewses()
- {
- ISession session = NHibernateStorage.GetCurrentSession();
- IList result = session.CreateQuery("from News as n where n.DateNews between :minDate and :maxDate")
- .SetDateTime("minDate", DateTime.Now.AddDays(-10))
- .SetDateTime("maxDate", DateTime.Now)
- .List();
- NHibernateStorage.CloseSession();
- return result;
- }
- }
- }
Xml-конфиг для Nhibernate:
NhProxy/News.hbm.xml
* This source code was highlighted with Source Code Highlighter.
- <?xml version="1.0" encoding="windows-1251" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="VeloLife" namespace="VeloLife.NhProxy">
- <class name="News" table="News">
- <id name="IdNews" column="IdNews">
- <generator class="native" />
- </id>
- <property name="DateNews" column="DateNews" type="DateTime"></property>
- <property name="CaptionNews" column="CaptionNews" type="string"></property>
- <property name="TextNews" column="TextNews" type="string"></property>
- </class>
- </hibernate-mapping>
И наконец - шаблон для автогенерации кода:
News.tgd
s template = FullGen.tg
;; Имя объекта
s ObjectName = News
;; Колонки сущности
tdef Fields
cols FieldName = "?", \
FieldType = "?", \
Caption = "?", \
DBName = "?", \
DBType = "?", \
IsPK = "false"
r IdNews, int, "Ид новости"; \
IsPK = true
r DateNews, DateTime, "Дата новости"
r CaptionNews, string, "Заголовок новости"
r TextNews, string, "Текст новости"
tend
Воот... так я больше делать никогда не буду....
Не эффективно...
Но - что-то запихну.
Это - текущая версия. Потом буду упрощать.
Обратите внимания на аттрибуты в контроллере:
[ExternalSecutityCheckAspect(
Permission = SecurityContext.PermissionLevel.Administrator)]
Это Security. Т.е. вызов этого метода произойдет только после полной проверки безопасности.
Это - аспект :)
Но об этом - после. Сегодня мне надоело и я пойду спать.
Комментариев нет:
Отправить комментарий