0

تولید کننده کد 3 لایه برای برنامه های asp.net

 
amirpetrucci0261
amirpetrucci0261
کاربر طلایی1
تاریخ عضویت : تیر 1388 
تعداد پست ها : 27726
محل سکونت : http://zoomstar.ir/

تولید کننده کد 3 لایه برای برنامه های asp.net
چهارشنبه 10 آذر 1389  5:41 AM

تولید کننده کد 3 لایه یک ابزار فوق العاده است که به برنامه نویسان کمک میکند تا کد 3 لایه مربوط به ماژول خود را در چند دقیقه تولید کنند. ضمن اینکه استاندارهای لازم را نیز رعایت کرده باشند.
این ابزار دارای ویژگی های زیر است :
• تولید کلیه کدهای لازم برای معماری 3 لایه که بتوانند مستقیما در visual studio .net اجرا شوند
• استفاده از الگوهای Web Template و Error Template
• تولید پروسیجرهای SQL و اسکریپتهای لازم برای ایجاد، اضافه، ویرایش و حذف کردن و همچنین نمایش رکوردهای جداول
• تولید کد هم برای زبان C# هم برای VB.NET
• پشتیبانی هم از ویرایش داده ها درون DataGrid و هم به صورت مجزا
• استفاده از CSS
• استفاده از متد پیشنهادی مایکروسافت به نام Microsoft Data Access Application Block
• استفاده از user control ها برای سربرگ و ته برگ
این مقاله از دو بخش تشکیل شده است. بخش اول به بررسی فایلهای تولید شده و بخش دوم به بررسی تولید کدها میپردازد.ابتدا بیایید فایلها را بررسی کنیم.
همانطور که میدانید در معماری 3 لایه، برنامه به 3 لایه مجزا تقسیم میشود:

1) لایه ارائه – presentation layer
2) لایه منطق برنامه – program logic or business layer
3) لایه داده – Data layer

لایه داده مسوول بازیابی، ذخیره و به روز رسانی داده ها است و بنابراین میتواند توسط پایگاه داده تجاری بیان شود. نکته این که در این برنامه ما از stored procedure ها یا همان روالهای ذخیره شده بعنوان بخشی از این لایه استفاده کرده ایم. استفاده از این روالها باعث بالاتر رفتن بازدهی و شفافیت کد برنامه میشود.
لایه منطق هسته اصلی سیستم است و رابطی میان دو لایه دیگر. در بسیاری از برنامه ها، برنامه نویسان تنها از یک لایه بین لایه ارائه و داده ها ذخیره شده استفاده میکنند. اگر چه این ایده نیز کاربردی است اما چندان جالب نیست چرا که بهتر است قواعد و قوانین کاری و منطق برنامه را از لایه ها داده ها جدا کرد.
درون لایه منطق، لایه ای به نام لایه دسترسی به داده ها یا Data Access Layer داریم که در حقیقت واسط لایه داده محسوب میشود و میداند که چگونه باید از لایه داده استفاده بکند.
 

مزایای برنامه نویسی 3 لایه

• چنانچه عملکرد صحیحی داشته باشیم، این معماری میتواند قابلیت استفاده مجدد از کدها را بسیار بالاتر ببرد
• از ایده شکستن و حل در آن استفاده شده است. وظایف به لایه های کوچکتری تقسیم شده اند که پیاده سازی هر یک ساده تر است
• کیفیت بالاتر. هر لایه میتواند توسط متخصص همان لایه مورد تحلیل و پیاده سازی قرار گیرد که مسلما کیفیت بالاتری خواهد داشت.
برطبق طراحی کدی که انجام داده ایم، یک کلاس پایه برای هر شیء در لایه کد داریم. این بدان معنی است که هر شیء ای که میخواهد به داده ها دسترسی داشته باشد از یک شیء مشترک که دسترسی به داده ها دارد مشتق شده است. علاوه بر این، هر کلاس لایه منطق از یک کلاس مشترک منطق مشتق شده است.
عموما زمانی که ما یک لایه سرویس داده طراحی میکنیم،2 ایده اصلی برای این کار وجود دارد: ساخت یک کلاس کمکی که کلیه دسترسیهای ما به داده ها را به نیابت از بخشهای مختلف برنامه انجام میدهد یا ساخت یک شیء داده ای برای هر نوع موجودیتی که نیاز دارد به داده ها دسترسی داشته باشد. ما از هر دو این متدها استفاده میکنیم. همانطور که قبلا هم گفته شد از Microsoft Data Access Application Block بعنوان کلاس کمکی که اعمال مربوط به پایگاه داده را انجام میدهد استفاده میکنیم. همچنین تمام اشیاء را از DataObject مشتق خواهیم کرد که در آن مجموعه ای از توابع سفارشی شده برای دسترسی به داده ها که در کلاس کمکی مذکور وجود ندارد استفاده میکنیم.
پوشه business دارای کلاسهایی است که از کلاس BussinessObject که در آن قوانین را تعریف میکنیم ارث بری میکنند. پوشه Data نیز دارای کلاسی به نام User است که از کلاس DataObject ای که در آن قوانین لایه داده را تعریف کرده ایم ارث بری کرده است.
کلاس SQLHelper نیز یکی از کلاسهای کمکی استاندارد است که حاوی همه متدهای استاندارد برای دستیابی به داده ها است.
همه صفحات ASPX هم از SitePage مشتق شده اند که برای گرفتن خطاها و تعریف یک الگو به کار گرفته میشود.

کلاس AppException

در بسیاری از زبانهای برنامه نویسی روتینهای مدیریت خطا متعدد هستند و کاربردهای متعددی دارند اما متاسفانه هنوز هم حتی در برخی زبانهای مدرن با مشکلی مواجه هستیم. چگونه میتوانیم مطمئن باشیم که خطاهای رخ داده ثبت میشوند؟ این چیز لازم برای هر وب سایتی است چرا که ممکن است روند کار به گونه ای باشد که کاربران اصلا خطای رخ داده را مشاهده نکنند.یا حتی زمانی هم که کاربران خطایی را مشاهده کنند احتمال اینکه خطای رخ داده را به ما گزارش بدهند بسیار کم است. پس ما باید مکانیزمی برای ثبت و پیگیری خطاهای رخ داده شده داشته باشیم.
برای حل این مشکل ما یک کلاس از System.ApplicationException مشتق کرده ایم که هر زمانی که خطایی رخ میدهند، خطا را در Event Log ثبت کرده و همچنین میتواند آن را در یک فایل ثبت خطا درج کند.از این طریق است که مدیر سیستم یا برنامه نویسان میتوانند نسبت به بررسی و رفع خطاهای رخ داده اقدام کنند.

فایلهای ایجاد شده

همانگونه که ملاحظه میکنید در لایه های data و business کلاس User ایجاد شده است. این کلاسها از اینترفیس IUser ارث بری میکنند تا از نظر قوانین، ساختاری یکسان داشته باشند.
لایه ارائه یا presentation نیز از فایلهای ASPX ای تشکیل شده است که کد پشت صفحه آنها نیز تولید شده اند.
‍فايلهاي SQL لايه داده را تشكيل ميدهند. در اين ميبايست مجموعه اي از رويه هاي SQL را براي اضافه كردن، ويرايش، نمايش و حذف ركوردها اضافه كنيم. اين لايه همچنين شامل يك اسكريپت براي ايجاد جدول است.

چگونه فايلها را ايجاد كنيم؟

نيازمنديها:
• IIS و پشتيباني آن از asp 3.0 (اين مورد را بايد در windows 2003 فعال كرد) و همچنين از asp.net (بايستي .net framework نصب باشد)
• SQL Server 7.0 يا نسخه هاي بعدي آن
• دانش كافي در زمينه asp.net, Visual wtudio.net, sql server procedures براي مجتمع سازي صفحات

تنظميات اوليه براي برپاسازي برنامه

1. ايجاد يك پايگاه داده مثلا به نام ThreeTierDemo_db
2. ايجاد يك جدول حاوي فيلد نام كاربري كه كليد اصلي است. مثلا فيلد AminId در جدول Admin_tb. اسكريپت مورد نظر هم در فايل SourceCode\Scripts\Admin_Tb.sql موجود است.

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[Admin_Tb]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Admin_Tb]
GO
CREATE TABLE [dbo].[Admin_Tb] (
[AdminId] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [varchar] (50) NOT NULL ,
[LastName] [varchar] (50) NOT NULL ,
[Username] [varchar] (25) NOT NULL ,
[Password] [varchar] (20) NOT NULL ,
[AddedDate] [datetime] NOT NULL ,
[UpdatedDate] [datetime] NOT NULL
) ON [PRIMARY]
GO

3. اجراي اسكريپت زير. اين اسكريپت هم در فايل SourceCode\Scripts\IntialScripts.sql موجود است

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[ProcGetReader]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ProcGetReader]
GO
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[ProcGetRecords]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ProcGetRecords]
GO
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[ProcAddRecordAction_Tb]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ProcAddRecordAction_Tb]
GO
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[RecordAction_Tb]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[RecordAction_Tb]
GO
CREATE TABLE [dbo].[RecordAction_Tb] (
[ActionId] [int] IDENTITY (1, 1) NOT NULL ,
[ResourceId] [int] NULL ,
[TableName] [varchar] (50) NOT NULL ,
[PrimaryId] [int] NOT NULL ,
[Action] [varchar] (15) NOT NULL ,
[ActionDate] [datetime] NOT NULL
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
create procedure ProcGetReader
@proc_DataText varchar(200),
@proc_DataValue varchar(75),
@proc_OrderBy varchar(75),
@proc_Tablename varchar(200)
as
set nocount on
declare @error_number int,
@query nvarchar(1000)
Select @query ='SELECT ' + @proc_DataText + ' , ' +
@proc_DataValue + ' FROM ' + @proc_Tablename +
' Order By ' + @proc_OrderBy
exec (@query)
-- error checking
select @error_number = @@error
if ( @error_number <> 0 )
begin
set nocount off
return 1
end
set nocount off
return 0
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
create procedure ProcGetRecords
@DataText varchar(200),
@DataValue varchar(75),
@OrderBy varchar(75),
@Tablename varchar(200)
as
set nocount on
declare @error_number int,
@query nvarchar(1000)
Select @query ='SELECT ' + @DataText + ' , ' + @DataValue +
' FROM ' + @Tablename + ' Order By ' + @OrderBy
exec (@query)
-- error checking
select @error_number = @@error
if ( @error_number <> 0 )
begin
set nocount off
return 1
end
set nocount off
return 0
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
create procedure ProcAddRecordAction_Tb
@proc_ResourceId int,
@proc_TableName varchar(50),
@proc_PrimaryId int,
@proc_Action varchar(15),
@proc_ActionDate datetime
as
set nocount on
/*set ansi_defaults on*/
declare @error_number int,
@row_count int
insert into RecordAction_Tb(
ResourceId,
TableName,
PrimaryId,
Action,
ActionDate
)
values (
@proc_ResourceId,
@proc_TableName,
@proc_PrimaryId,
@proc_Action,
@proc_ActionDate
)
-- error checking
select @error_number = @@error,
@row_count = @@rowcount
if ( @error_number <> 0 ) or ( @row_count <> 1 )
begin
set nocount off
return 1
end
set nocount off
return 0
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

وب سايت

1. ايجاد يك پروژه در Visual Stusio .net . مثلا به نام ThreeTierDemo


2. افزدون موارد زير در فايل web.config

<appSettings>
<!-- User application and configured property settings go here.-->
<!-- Example: <add key="settingName" value="settingValue"/> -->
<add key="ConnectionString"
value="Server=(local);UID=sa;PWD=password;Database=ThreeTierDemo_db" />
<add key="ErrorLogFile"
value="~/Errors/ErrorLog.txt" />
</appSettings>

3. كپي كردن پوشه هاي components, CSS, UserControls, Images, Errors از SourceCode\Csharp يا SourceCode\VBو قرار دادن آنها در ريشه وب سايت. ضميمه كردن همه پوشه هاي درون برنامه .
قبل از ضميمه كردن فايلها
پس از ضميمه كردن فايلها
4. براي پرو‍ژه هاي VB شما نياز داريد تا RootNamespace را در Project Properties با "" مقداردهي كنيد

توليد كننده كد

1. پوشه SourceCode\ThreeTierGenerator را در C:\Inetpub\wwwroot\ كپي كنيد
2. پوشه ThreeTierGenerator حاوي CommonSettings.asp است. جايي كه شما ميتوانيد AuthorCompany و Authorتغيير دهيد. اين به شما اطمينان خواهد داد كه نام شما و نام شركت شما در توضيحات كدها درج خواهد شد.
3. توسط مرورگر خود، http://localhost/ThreeTierGenerator/GenerateAllPages.asp را مشاهده كنيد
فيلدهايي كه در صفحه نمايش ميابند چنين هستند
Pages Folder
Pages Folder پوشه اي است كه صفحات ASPX در آن قرار دارند
Object name
Object name نام كلاسي است كه به جدول لينك شده است و براي ايجاد كلاس لايه منطق (يا كار يا Business) و لايه داده استفاده شده است.
Form name
Form name نام فروم توليد شده است
Action
Action بخشي از نام صفحه ASPX است. تصور كنيد كه ما در فيلد Action عبارت Users را وارد كنيم. در اين حالت نام صفحات چنين خواهد بود : AddUsers.aspx, UpdateUsers.aspx و ...
Title
مشخص كننده عنوان همه صفحات است
Table
نام جدول درون پايگاه داده را مشخص ميكند
Field ID
فيلد شناسايي توليد شده براي جداول است. اين مورد براي لينكها استفاده ميشود. مثلا ميتوانيد از UserId براي اين فيلد استفاده كنيد
Primary ID
كليد اصلي جدول است. كه ميتواند شامل چندگانه باشد و توسط كاما نام فيلدها از هم جدا شوند.
Site folder
مكان فيزيكي ذخيره شدن فايلهاي شماست. مثلا C:\Inetpub\wwwroot\ThreeTierDemo
Class folder
نام پوشه اي است كه فايلهاي كلاسها در آنجا ايجاد ميشوند.
Namespace
نام namespace ريشه سايت است. مثلا Company.ThreeTierDemo
Admin table
نام آن جدولي است كه شناسه كاربري كاربر ذخيره شده است. چنانچه شما ميخواهيد در برنامه تان قابليت ردگيري اعمال كاربران را داشته باشيد ميبايد اين فيلد را پر كنيد.
Admin table primary key
نام كليد اصلي جدولي است كه شناسه كاربري كاربر در آن ذخيره شده است. چنانچه شما ميخواهيد در برنامه تان قابليت ردگيري اعمال كاربران را داشته باشيد ميبايد اين فيلد را پر كنيد.
CSS file path
مسير فايل CSS نسبت به پوشه صفحات. مثلا ../CSS/Site.css
Fields
نام فيلدهايي كه هم در جدول و هم در فايلهاي كلاسها استفاده ميشوند. مثلا FirstName, LastName, Email, Comments و ...
SQL field type
نوع داده اي SQL براي فيلدها. مثلا

Decimal(14;2), INT, VARCHAR(75),VARCHAR(75),VARCHAR(100),VARCHAR(500)

NET field type
نوع داده اي .net براي فيلدها. مثلا string, string, string, string
Null/Not Null
قابليت Null بودن يا نبودن فيلدها. مثلا NOT NULL, NOT NULL, NOT NULL, NOT NULL
Fields display names
آن نامي از فيلدها كه در صفحات نمايش ميابند. مانند First Name, Last Name, Email, Comments
Input type
انواع مختلف اين فيلد ميتواند text, email, password, textarea, select, selectdynamic, date, checkbox باشد. چنانچه نياز داريد فيلد مورد نظر شما حاوي validator يا اعتبار سنج هم باشد (براي فيلدهاي ضروري كه كاربر حتما بايد آنها را پر كند)، از ‘req’ در انتهاي نام استفاده كنيد. مثلا textreq, textreq, emailreq, textarea
Input max length
مشخص كننده حداكثر طول ووردي هاي است. مثلا 75,75,100,500
مثال بري همه فيلدهاي ذكر شده

o Pages folder: Users
o Object Name: User
o Form name: Users
o Action: Users
o Title: User
o Table: Users_Tb
o Field Id: UserId
o Primary Id: Email
o C:\Inetpub\wwwroot\ThreeTierDemo
o Site folder: Components
o Namespace: Company.ThreeTierDemo
o Admin table: Admin_Tb
o Admin table primary key: AdminId
o CSS file ath: ../CSS/Site.css
o Fields: FirstName, LastName, Email, Comments
o SQL field type: VARCHAR(75),VARCHAR(75),VARCHAR(100),VARCHAR(500)
o .NET field type: string, string, string, string
o Null/Not Null: NOT NULL, NOT NULL, NOT NULL, NOT NULL
o Fields display Names: First Name, Last Name, Email, Comments
o Input type: textreq, textreq, emailreq, textarea
o Input max length: 75,75,100,500

4. چك باكسهاي مرتبط با Class, Default, Add, Update, Table, SQL Add, SQL Update, SQL Delete, SQL Show, SQL Select ميتوانند علامت زده شوند تا فايلهاي مربوطه در مكان پوشه صفحه ها نوشته شوند. براي نوشته شدن فايلها شما بايد Write Files را نيز علامت بزنيد
 

5. مجوزهاي دسترسي مناسب بايد براي پوشه ريشه وب سايت تنظيم شوند


6. فايلهاي توليد شده ضميمه پروژه گردند


قبل از ضميمه كردن فايلها
بعد از ضميمه كردن فايلها

7. اسكريپت SQL توليد شده اجرا شود. با شروع از Users_tb.sql


8. در مرورگر فايل Default.aspx مرور شود.


9. اگر شما Append Docs را علامت زده ايد، اطلاعات مربوط به فايلهاي متعدد به فايل Documentation.txt اضافه ميشود كه شما ميتوانيد از آنها براي مستند سازي استفاده كنيد


10. اگر Append Requests را علامت بزنيد، اطلاعات حاوي همه داده هايي كه شما وارد كرده ايد در فايل <Namespace>.txt ذخيره ميشود. مثلا در فايل Company.ThreeTierDemo.txt.


11. براي اطمينان از اينكه اطلاعات را درست وارد كرده ايد صفحه زير به شما نشان داده خواهد شد


 

Forms authentication

براي پياده سازي forms authentication ،اين مراحل را انجام دهيد


1. پوشه SourceCode/Login را كپي كرده و ضميمه پرژه خود كنيد


2. فايل web.config را از پوشه login كپي كرده و آن را در زير پوشه ها قرار دهيد. مثلا پوشه users كه شما ميخواهيد از آن محافظت كنيد


3. برچسب authentication در فايل web.config در ريشه وب سايت را به اين شكل ويرايش كنيد

<authentication mode="Forms">
<forms name=".MyCookie" loginUrl="login/login.aspx"
protection="All" timeout="80" path="/" />
</authentication>

4. اسكريپت را اجرا كنيد. Admin_tb, AdminId را با مقاديري خود جايگزين كنيد

if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[ProcAuthenticate]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[ProcAuthenticate]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE Procedure ProcAuthenticate
@proc_username Varchar( 25 ),
@proc_password Varchar( 20 )
As
DECLARE @AdminId INT
DECLARE @actualPassword Varchar( 25 )
SELECT
@AdminId = AdminId,
@actualPassword = password
FROM Admin_Tb
WHERE username = @proc_username
IF @AdminId IS NOT NULL
IF @proc_password = @actualPassword
RETURN @AdminId
ELSE
RETURN - 2
ELSE
RETURN - 1
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

تشکرات از این پست
دسترسی سریع به انجمن ها