تولید کننده کد 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
مزایای برنامه نویسی 3 لایه
• چنانچه عملکرد صحیحی داشته باشیم، این معماری میتواند قابلیت استفاده مجدد از کدها را بسیار بالاتر ببردکلاس AppException
در بسیاری از زبانهای برنامه نویسی روتینهای مدیریت خطا متعدد هستند و کاربردهای متعددی دارند اما متاسفانه هنوز هم حتی در برخی زبانهای مدرن با مشکلی مواجه هستیم. چگونه میتوانیم مطمئن باشیم که خطاهای رخ داده ثبت میشوند؟ این چیز لازم برای هر وب سایتی است چرا که ممکن است روند کار به گونه ای باشد که کاربران اصلا خطای رخ داده را مشاهده نکنند.یا حتی زمانی هم که کاربران خطایی را مشاهده کنند احتمال اینکه خطای رخ داده را به ما گزارش بدهند بسیار کم است. پس ما باید مکانیزمی برای ثبت و پیگیری خطاهای رخ داده شده داشته باشیم.فایلهای ایجاد شده
همانگونه که ملاحظه میکنید در لایه های data و business کلاس User ایجاد شده است. این کلاسها از اینترفیس IUser ارث بری میکنند تا از نظر قوانین، ساختاری یکسان داشته باشند.چگونه فايلها را ايجاد كنيم؟
نيازمنديها:تنظميات اوليه براي برپاسازي برنامه
1. ايجاد يك پايگاه داده مثلا به نام ThreeTierDemo_dbif 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>
توليد كننده كد
Decimal(14;2), INT, VARCHAR(75),VARCHAR(75),VARCHAR(100),VARCHAR(500)
NET field typeo 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
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