Стандарты кодирования для 3-х уровневой архитектуры - PullRequest
0 голосов
/ 13 декабря 2011

Мне нужно несколько предложений для работы с 3-уровневой архитектурой, недавно я завершил один из моих клиентов с 3-уровневой архитектурой, в котором я преобразовывал данные непосредственно в html из sql server 2008 и извлекал записи в .net, .net просто выполнял задачу рендеринга, поэтому один из моих друзей сказал, что это может значительно снизить производительность, но я никогда не получал никаких жалоб от клиента по поводу того же, поскольку записи, которые я преобразовываю в html из sql server 2008, не являются более 10, и теперь для второго сайта, я хочу принять больше мер предосторожности при отображении данных на сайте, теперь на этот раз я планировал снова использовать 3 уровня, но теперь вместо преобразования данных в HTML на сервере SQL я Перетаскивая записи из SQL Server 2008, на мой уровень данных и на уровне бизнес-уровня, я преобразовываю их в HTML ... так что кто-нибудь может предложить, какой из них лучше, предыдущее преобразование в HTML в SQL SERVER или в. NET

Под преобразованием в HTML я имею в виду:

ALTER PROCEDURE [dbo].[SP_TVT_Article_Get]
    @ID INT
AS
BEGIN
    DECLARE @HTML NVARCHAR(MAX)
    SET @HTML = '';
    SELECT @HTML = '
    <div style="margin-top:10px;" class="craig"><span style='+(SELECT CASE ISNULL(Author, '') WHEN '' THEN '"display:none; float:left"' ELSE '"display:block; float:left"' END)+'> ' + ISNULL(C.Author, '' )+ ' /</span> ' + DATENAME(DW, C.PublishDate) + ' ' + CONVERT(VARCHAR(15), CAST(C.PublishDate AS TIME), 100) +'</div>
    <div class="sony_title">'+C.Title+'</div>' +
    CASE 
    WHEN C.SecondaryTitle IS NOT NULL THEN    
    '<div class="tokiyo">' + C.SecondaryTitle + '</div>
    'ELSE
    '<div class="tokiyo">TOKYO: Six broadcasters & theaters in at least 22 will carry 3D coverage.</div>'
    END +
    '<div class="imgtxt_para01"> <img src="'+isnull(C.Thumbnail,'')+'" style="'+(SELECT CASE ISNULL(C.Thumbnail,'') WHEN '' THEN '"display:none"' ELSE '"display:block"' END)+'" /> 
    '+ CAST(C.Article AS NVARCHAR(MAX)) +'</div>'
     FROM CrossArticle_Article C
     WHERE Id = @ID

     SELECT @HTML
END

и на этот раз я планирую сделать вот так .. Мой DataLogic Layer будет выглядеть так:

  public void GetArticle(int PortalID, int ArticleID, out DateTime PublishDate, out string Article, out string Author, out string Title)
    {
        object _getArticle = "";
        Article = Author = Title = null;
        PublishDate = DateTime.Now;
        using (SqlCommand comGetArticle = new SqlCommand("sp_EQEM_GetArticle", ConnectDatabase))
        {
            comGetArticle.CommandType = CommandType.StoredProcedure;
            comGetArticle.Parameters.AddRange(new SqlParameter[]{new SqlParameter("@PortalID", PortalID),
                                                                 new SqlParameter("@ArticleID", ArticleID)});
            ConnectDatabase.Open();
            using (SqlDataReader reader = comGetArticle.ExecuteReader())
            {
                while (reader.Read())
                {
                    Title = reader.GetValue(0).ToString();
                    Author = reader.GetValue(1).ToString();
                    PublishDate = Convert.ToDateTime(reader.GetValue(2));
                    Article = reader.GetValue(3).ToString();
                }
            }
            ConnectDatabase.Close();
        }
    }

и бизнес-слой будет выглядеть так:

   public object GetArticle()
    {
        string Title, Author, Article;
        DateTime PublishDate;
        connection.GetArticle(PortalID, ArticleID, out PublishDate, out Article, out Author, out Title);
        StringBuilder str = new StringBuilder();
        str.Append("<div class='aricle_para'>");
        str.Append("<h1>" + Title + "</h1>");
        str.Append("<span style='float:left; display:" + (String.IsNullOrEmpty(Author) ? "none" : "block") + "'>By " + Author + "&nbsp; | </span><span>&nbsp; " + PublishDate.DayOfWeek.ToString().Substring(0, 3) + ", " + PublishDate.ToString("dd MMM yyyy") + "</span><br />");
        str.Append(HttpContext.Current.Server.HtmlDecode(Article));
        str.Append("</div>");
        return str.ToString();
    }

и тогда я буду вызывать функцию GetArticle на странице, где я хочу отобразить статью ...

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

OMG, пожалуйста, не делай этого. Это неправильно во всех отношениях, потому что я везде вижу встроенный HTML.

3-уровневая архитектура означает, что постоянство не должно знать об услугах, не должно знать о представлениях. В этой договоренности нет ничего сложного.

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

Я не вижу использования CSS или JavaScript.

Как включить мобильный интерфейс?

Это не может быть больше неправильно .

1 голос
/ 13 декабря 2011

«Уровень» в n-уровневой архитектуре называется так, потому что он функционально отличается от других частей приложения; на самом деле правильнее будет сказать, что он изолирован даже от вопроса, используется ли он в одном или n приложениях.

«Слои» обычно относятся к разным группам функций в пределах одного уровня.

«3-уровневые» приложения возникли потому, что схема использования доступа к данным, бизнес-логики и представления в трех разных уровнях быстро подходит для многих сценариев, но это ни в коем случае не предписывает, что вам нужно 3 уровня. Дело прежде всего в том, что у вас вообще есть уровни.

Чтобы квалифицироваться как уровень, в целом его обязанности не должны переходить в другой. Имея хранимую процедуру в вашей базе данных, которая возвращает HTML, вы переводите разметку презентации в свой уровень бизнес-логики (выбранного вами трехуровневого подхода), а затем дальше в логику представления.

Вы найдете все гораздо проще для тестирования и повышения производительности, возвращая только данные из ваших хранимых процедур. Ваша бизнес-логика может обрабатывать эти данные, выбирая, какие (если таковые имеются) фильтры, модификации и рабочие процессы применять, и добавлять метаданные к этим данным, прежде чем передавать их наружу на уровень представления, который несет единоличную ответственность за размещение этих данных внутри разметки HTML. Таким образом, ваш уровень представления сохраняется отдельно, и вы можете добавить к нему слои, которые могут генерировать разметку для мобильных приложений, или JSON для ответов служб RESTful и т. Д. - и все это без заботы о хранимых процедурах.

Комментарии вашего друга по поводу оптимизации производительности были верхушкой айсберга, но, возможно, имели в виду естественное следствие сохранения этого разделения: вы не будете объединять строки в вашей хранимой процедуре, чтобы генерировать разметку, которая затем будет модифицирована в вашем бизнесе. логика.

...