PDA

View Full Version : معماری 3 لایه



mohsen99
دوشنبه 08 فروردین 1384, 10:03 صبح
فرض کنید معماری یک برنامه دارای 3 لایه:
1- User Interface layer
2- Business layer
3- Data Layer
باشد
سوال: آیا ارتباط لایه ها فقط یک طرفه (از بالا به پایین) است یا ارتباط می تواند دو طرفه هم باشد؟
به عبارت ساده تر آیا می توان در لایه 3 از کلاسهای لایه 2 استفاده کرد؟

مهدی کرامتی
دوشنبه 08 فروردین 1384, 11:03 صبح
1- ارتباط میتواند دو طرفه باشد.

2- ارجاعات کلاسهای لایه ها بر حسب نیاز است. بعنوان مثال، طبق ترتیب شماره گذاری شما، لایه 3 چه نیازی به فراخوانی لایه 2 میتواند داشته باشد؟

In_Chan_Nafar
دوشنبه 08 فروردین 1384, 12:12 عصر
خواهش می کنیم اگه کسی مثالی در مورد 3tier داشته باشه (البته به جزء Duwamish) به ما هم حال بده
با تشکر

mohsen99
دوشنبه 08 فروردین 1384, 12:26 عصر
لایه 3 چه نیازی به فراخوانی لایه 2 میتواند داشته باشد؟
برای مثال برای ثبت اطلاعات یک object از یک کلاس در db بجای فرستادن تک تک فیلدها به لایه 3 خود آن object فرستاده شود.

Babak-Aghili
دوشنبه 08 فروردین 1384, 12:28 عصر
من این کتاب را توصیه میکنم ::

Microsoft Press :: Building Enterprise Soloutions With .NET

البته به اون دات نت اش نگاه نکیند ! بطور کلی توضیح داده .

In_Chan_Nafar
دوشنبه 08 فروردین 1384, 12:54 عصر
اقا این کتاب رو کدوم انتشارات افست کرده
راستی یه قیمت هم محبت می کنی
راستی اگه E-book داری حال بده
راستی در مورد Crystal Reports دات نت (البته در مورد برنامه نویسی) کتابی سراغ دارید
مرسی :wink:

مهدی کرامتی
دوشنبه 08 فروردین 1384, 14:22 عصر
خواهش می کنیم اگه کسی مثالی در مورد 3tier داشته باشه (البته به جزء Duwamish) به ما هم حال بده
به چه زبانی مثال میخواهی؟

Babak-Aghili
دوشنبه 08 فروردین 1384, 21:43 عصر
این تصویر را از توی همان کتابه آوردم .
فکر کنم مفید باشه .

In_Chan_Nafar
دوشنبه 08 فروردین 1384, 22:42 عصر
آقای کرامتی اگه ممکن یه مثال در VB.NET می خواستم (راستی Windows App باشه)
tnx

مهدی کرامتی
دوشنبه 08 فروردین 1384, 22:55 عصر
این یکی رو شرمنده.

من VB.NET رو اونقدر وارد نیستم که پاسخ این سوال رو در اون زبان بهتون بدم.

اگر در #C یا دلفی خواستید در خدمتم.

In_Chan_Nafar
دوشنبه 08 فروردین 1384, 23:02 عصر
آقای کرامتی اگه سی شارپ هم باشه محبت می فرمایید (Windows App باشه لطفا)

mohsen99
سه شنبه 09 فروردین 1384, 09:44 صبح
این تصویر را از توی همان کتابه آوردم .
فکر کنم مفید باشه .
همانطور که در عکس هم مشخصه همه فلشها یک طرفه است
علت پرسیدن سوالم هم همین بود که همیشه در کتابها فلش یک طرفه است از بالا به پایین

quack
سه شنبه 09 فروردین 1384, 12:36 عصر
1- ارتباط میتواند دو طرفه باشد.

2- ارجاعات کلاسهای لایه ها بر حسب نیاز است. بعنوان مثال، طبق ترتیب شماره گذاری شما، لایه 3 چه نیازی به فراخوانی لایه 2 میتواند داشته باشد؟


معماری 3 لایه روشی برای جدا کردنه منطق تجاری برنامه از زیر ساخت لازم برای اجرای اونه
در لایه میانی میتوان از com+ یا corbaیا روش بورلند MIDASاستفاده کرد
پس کاملا مشخصه که لایه های پایین به لایه های بالا visibility ندارند (com+ به UI دسترسی نداره)

نکته اصلی اینکه در متدولوژی معماری N-لایه ای (نه فقط 3 لایه) لایه های پایین نباید به لایه های بالا دسترسی داشته باشند در موارد خاص که مجبور به اینکار هستیم راه حله ارئه شده اگر اسمش درست یادم باشه Observer Pattern است.می تونی به کتابهای Object oriented Design مراجعه کنی

mohsen99
چهارشنبه 10 فروردین 1384, 15:47 عصر
نکته اصلی اینکه در متدولوژی معماری N-لایه ای (نه فقط 3 لایه) لایه های پایین نباید به لایه های بالا دسترسی داشته باشند
بهتر علت پرسیدن سوال توضیح بدم
تا انجایی که من نوی دانشگاه خوندم و توی کتابها دیدم معماری 3لایه همین طوره که quack گفته ولی وقتی کد Community Server رو بررسی می کردم دیدم که در لایه data از کلاسهای لایه بالاتر استفاده شده
می خواستم بدونم بالاخره کدومش درسته؟؟؟

M.GhanaatPisheh
یک شنبه 14 فروردین 1384, 01:35 صبح
Microsoft Press :: Building Enterprise Soloutions With .NET
این کتاب یه دید جامع و باز از Pattern ها بهتون میده که توی دید تحلیلیتون و حتی Programmingتون بسیار تاثیر گذار خواهد بود.


نقل قول:
خواهش می کنیم اگه کسی مثالی در مورد 3tier داشته باشه (البته به جزء Duwamish) به ما هم حال بده

به چه زبانی مثال میخواهی؟
شما دارید راجع به معماری حرف می زنید
به چه زبانی اینجا واژه غریبی است.


همانطور که در عکس هم مشخصه همه فلشها یک طرفه است
علت پرسیدن سوالم هم همین بود که همیشه در کتابها فلش یک طرفه است از بالا به پایین

دوست عزیز
هر لایه یک سطح انتزاعی برای سطح بالا تر است
مسخره است که از کدهایUI توی Business Logic استفاده بشه یا موارد مشابه.مگر موارد خاص...


اگر اسمش درست یادم باشه Observer Pattern است
درسته دوست عزیز.

mohsen99
یک شنبه 14 فروردین 1384, 16:04 عصر
هر لایه یک سطح انتزاعی برای سطح بالا تر است
مسخره است که از کدهایUI توی Business Logic استفاده بشه یا موارد مشابه.مگر موارد خاص...

من نگفتم از کدهای UI در Business Logic استفاده بشه
منظور من استفاده از کلاسهای Business Logic در لایه data بود

M.GhanaatPisheh
یک شنبه 14 فروردین 1384, 19:52 عصر
بازم همون جریانه است.
یه کم فکر کنید. :wink:

quack
دوشنبه 15 فروردین 1384, 07:59 صبح
منظور من استفاده از کلاسهای Business Logic در لایه data بود

یه مثال بزن تا راجع اون بحث کنیم

MehdiRah
دوشنبه 15 فروردین 1384, 08:21 صبح
سلام آقای کرامتی

اگه امکانش هست برای من به دلفی یک مثال بفرستید .
mehdi_rah@yahoo.com

mohsen99
دوشنبه 15 فروردین 1384, 09:25 صبح
یه مثال بزن تا راجع اون بحث کنیم
برای مثال قسمتی از کد CommunityServer:
از فایل WeblogSqlDataProvider.cs


//------------------------------------------------------------------------------
// <copyright company="Telligent Systems">
// Copyright (c) Telligent Systems Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using CommunityServer.Blogs; //کلاس لایه Business Logic
using CommunityServer.Blogs.Components; //کلاس لایه Business Logic
using CommunityServer.Components; //کلاس لایه Business Logic

namespace CommunityServer.Data
...


کد اضافه کردن پست به وبلاگ :


public override BlogPostResults AddPost(WeblogPost post, User user, out int postID)
{
postID = -1;

// Create Instance of Connection and Command Object
//
using( SqlConnection myConnection = GetSqlConnection() )
{
SqlCommand myCommand = new SqlCommand(databaseOwner + ".cs_weblog_Post_Create", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;

myCommand.Parameters.Add("RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

// Add parameters
//
myCommand.Parameters.Add("@SectionID", SqlDbType.Int).Value = post.SectionID;
myCommand.Parameters.Add("@ParentID", SqlDbType.Int).Value = post.ParentID;
myCommand.Parameters.Add("@AllowDuplicatePosts", SqlDbType.Bit).Value = true;
myCommand.Parameters.Add("@DuplicateIntervalInMinutes", SqlDbType.Int).Value = 1;
myCommand.Parameters.Add("@Subject", SqlDbType.NVarChar, 256).Value = post.Subject;
myCommand.Parameters.Add("@IsLocked", SqlDbType.Bit).Value = post.IsLocked;
myCommand.Parameters.Add("@IsApproved", SqlDbType.Bit).Value = post.IsApproved;
myCommand.Parameters.Add("@IsTracked", SqlDbType.Bit).Value = post.IsTracked;
myCommand.Parameters.Add("@PostType", SqlDbType.Int).Value = post.PostType;
myCommand.Parameters.Add("@EmoticonID", SqlDbType.Int).Value = post.EmoticonID;
myCommand.Parameters.Add("@UserID", SqlDbType.Int).Value = user.UserID;
myCommand.Parameters.Add("@Body", SqlDbType.NText).Value = post.Body;
myCommand.Parameters.Add("@FormattedBody", SqlDbType.NText).Value = post.FormattedBody;
myCommand.Parameters.Add("@UserHostAddress", SqlDbType.NVarChar, 32).Value = post.UserHostAddress;
myCommand.Parameters.Add("@PostDate",SqlDbType.DateTime,8).Value = post.PostDate;
myCommand.Parameters.Add("@BloggerTime",SqlDbType.DateTime,8).Value = post.BloggerTime;
...

همانطور که می بینید WeblogPost وUser از کلاسهای لایه Business Logic هستند

quack
دوشنبه 15 فروردین 1384, 13:13 عصر
:گیج: متاسفانه منظورت رو متوجه نشدم . میشه مشکل رو یه ذره توضیح بدی

mohsen99
دوشنبه 15 فروردین 1384, 15:57 عصر
متاسفانه منظورت رو متوجه نشدم . میشه مشکل رو یه ذره توضیح بدی
صورت سوال : آیا در لایه data می توان از کلاسهای لایه Business استفاده کرد ؟

جواب 1 : خیر
دلیل : کتابهای مهندسی نرم افزار و جواب آقای قناعت پیشه

جواب 2 : بله
دلیل : مثالهای عملی موجود مثل برنامه Community Server 1.0 که قسمتی از کدشو قبلا نوشتم

1 سوال با 2 جواب درست (و متضاد) :strange:

quack
دوشنبه 15 فروردین 1384, 19:24 عصر
اولا که توی این مثالی که زدی فلش همچنان بالا به پایینه
اگه منظورت پارامتر های تابع addpost که user و... یک سری دیتاس که با یک Message از لایه بالا به لایه 3 فرستاده شده نه از پایین به بالا

دوما جواب سوالت رو توی اولین ارسالم دادم . گفتم که مواردی هست که لازمه یک Message از پایین به بالا فرستاده بشه(البته اما نه این مثالی که زدی). از لحنت مالومه اصلا نرفتی Patternی که بهت گفتم رو بخونی

mohsen99
چهارشنبه 17 فروردین 1384, 11:42 صبح
یک سری دیتاس که با یک Message از لایه بالا به لایه 3 فرستاده شده نه از پایین به بالا
Message یا اشیاپی از کلاسهای لایه بالاتر؟

در مورد load چی؟ برعکس همین مورد اتفاق می افته

اَرژنگ
سه شنبه 12 تیر 1386, 13:42 عصر
برای مثال برای ثبت اطلاعات یک object از یک کلاس در db بجای فرستادن تک تک فیلدها به لایه 3 خود آن object فرستاده شود.
استفاده از این روش چه فایده‌ای اضافه میکنه؟
در مورد مثال از کامیونیتی سرور:
اگر میخواستند ،میتوانستند از یک اینترفیس که در بیزینیس لایر هم پیاده شده استفاده کنند و به آ نطریق لازم نبود که لایه ۳ در مورد لایه ۲ چیزی بدانه (هر دو لایه در مورد اینترفیسی که باید باهاش کار کنند میدانستند).
در هیچ حالتی لازم نیست که لایه ۳ از لایه ۲ استفاد کند و اگر هم جایی دیدید که استفاد میکند میشه این نیاز را برداشت.

ahmad_ir
چهارشنبه 03 آذر 1389, 13:51 عصر
سلام اگه لطف کنید یه مثال از سی شارپ بزارید خیلی خوب میشه.
ممنون