Çok Katmanlı Yazılım Mimarisi Örneği – C#

sdkbyrm

olwα.ɴeт
Üyelik Tarihi
23 Aralık 2020
Mesajlar
813
Beğeniler
1
Puanı
3
Ticaret: 0 / 0 / 0
Diğer karmaşık yapılar gibi, yazılımın da sağlam bir temel üzerine kurulması gerekir. Temel senaryoları dikkate almamanız, genel sorunlar için tasarım yapmamamız veya kilit kararların uzun vadeli sonuçlarını takdir etmemesi başvurunuzu risk altına sokabilir. Modern araçlar ve platformlar, uygulama oluşturma görevi basitleştirmeye yardımcı olur, ancak uygulamanızı kendi senaryolarınıza ve gereksinimlerinize göre dikkatlice tasarlama gereksinimini değiştirmez. Kötü mimarinin maruz kaldığı riskler kararsız, mevcut veya gelecekteki iş gereksinimlerini destekleyemeyen veya bir üretim ortamında dağıtmak veya yönetmek zor olan yazılımları içerir.


Sistemler kullanıcı, sistem (BT altyapısı) ve iş hedefleri dikkate alınarak tasarlanmalıdır. Bu alanların her biri için, önemli senaryoların ana hatlarını çizmeli ve önemli nitelik niteliklerini (örneğin, güvenilirlik veya ölçeklenebilirlik) ve memnuniyetsizlik ve memnuniyetsizliğin kilit alanlarını tanımlamalısınız. Mümkün olduğunda, bu alanların her birinde başarıyı ölçen metrikleri geliştirin ve düşünün.

Veri merkezli uygulamalarda veriye nasıl erişeleceği, üzerinde ne gibi uygulamaların yapılacağı, ve kullanıcı tarafına ne şekilde sunum yapılacağı bir programcı için en önemli sorunlardır. Üç katman mimarisi de tam bu noktada programcılara yardımcı olmaktadır.

N Katmanlı / 3 Katmanlı Mimari Stil

N katmanlı ve 3 katmanlı, işlevselliğin katmanlı stille aynı şekilde kesimlere ayrılmasını açıklayan mimari dağıtım stilleri olmakla birlikte, her bir kesim fiziksel olarak ayrı bir bilgisayarda bulunabilen bir katmandır. Bileşene yönelik yaklaşımla geliştirilmiştir.

N katmanlı uygulama mimarisi, gelişmiş ölçeklenebilirlik, kullanılabilirlik, yönetilebilirlik ve kaynak kullanımı sağlayan uygulamaların işlevsel ayrışması, servis bileşenleri ve bunların dağıtımı ile karakterize edilir. Her katman hemen hemen üstündeki ve altındaki katmanlar hariç, diğer tüm katmanlardan tamamen bağımsızdır. Ninci katman yalnızca n + 1 katmanından gelen bir isteği nasıl ele alacağını, bu talebi n-linci katmanı (varsa) nasıl yönlendirileceğini ve talebin sonuçlarını nasıl ele alacağını bilmelidir. Katmanlar arasındaki iletişim, daha iyi ölçeklenebilirliği desteklemek için genellikle eşzamansızdır.

N katmanlı mimariler genellikle her biri ayrı bir fiziksel sunucuda bulunan en az üç ayrı mantıksal parçaya sahiptir. Her bölüm belirli işlevlerden sorumludur. Katmanlı bir tasarım yaklaşımı kullanırken, birden fazla hizmet veya uygulama katmanın maruz kaldığı işlevselliğe bağlı olduğu durumlarda, bir katman bir katman üzerinde konuşlandırılır.

N katmanlı / 3 katmanlı mimari tarzın bir örneği, güvenliğin önemli olduğu tipik bir finansal Web uygulaması örnek verilebilir. İş katmanı, güvenlik duvarı arkasında konuşlandırılmalıdır. Sunum katmanını ise ağ üzerinde dağıtımı yapılmış web sayfalarından ibaret olabilir. Diğer bir örnek, sunum katmanının istemci makinelerde dağıtıldığı ve iş katmanı ve veri erişim katmanı bir veya daha fazla sunucu katmanında konuşlandırıldığı tipik zengin istemci bağlı bir uygulama düşünülebilir.

N katmanlı / 3 katmanlı mimari tarzın başlıca faydaları şunlardır:

Bakım kolaylığı. Her katman diğer katmanlardan bağımsız olduğu için, güncellemeler veya değişiklikler, uygulamayı bir bütün olarak etkilemeden gerçekleştirilebilir.

Ölçeklenebilirlik. Katmanlar katmanların konuşlandırılmasına bağlı olduğundan, bir uygulamanın ölçeklendirilmesi makul derecede kontrol edilebilir bir hal alır.

Esneklik. Her katman bağımsız olarak yönetilebilir veya ölçeklenebilir olduğundan esneklik artar.

Kullanılabilirlik. Uygulamalar, kullanılabilirliği artıran kolay ölçeklenebilir bileşenler kullanan sistemlerin etkinliğini de aynı ölçüde arttırır.

Uygulamadaki katmanların işlem gereksinimleri farklılık gösteriyorsa, bir katmandaki işlemenin diğer katmandaki işlemleri yavaşlatmak için yeterli kaynakları alabilmesi için N katmanlı veya 3 katmanlı mimari tarzı göz önünde bulundurun veya katmanların güvenlik gereksinimlerini düşünün. Örneğin sunum katmanı hassas verileri saklamamalı, iş ve veri katmanlarında saklanmalıdır.

Mantıksal Katmanlı Tasarım

Tasarladığınız uygulamanın türüne bakılmaksızın veya kullanıcı arabirimine sahip olup olmadığı veya yalnızca hizmetleri (bir uygulamanın hizmetler katmanıyla karıştırılmamasını gerektiren bir hizmet uygulaması) olup olmadığına bakmaksızın, tasarımı mantıksal gruplar halinde ayrıştırabilirsiniz. Yazılım bileşenleri. Bu mantıksal gruplara katmanlar denir. Katmanlar, bileşenler tarafından gerçekleştirilen farklı görev türlerini ayırt etmeye yardımcı olur, böylece bileşenlerin tekrar kullanılabilirliğini destekleyen bir tasarım yaratmayı kolaylaştırır. Her mantıksal katman, alt katmanlara gruplandırılmış ve alt katmanın her biri belirli bir görev türünü içeren ayrı ayrı bileşen türleri içerir.

Çözümlerin çoğunda bulunan genel bileşen türlerini tanımlayarak, bir uygulamanın veya hizmetin anlamlı bir haritasını oluşturabilir ve daha sonra bu haritayı tasarımınız için bir plan olarak kullanabilirsiniz. Farklı bir rol ve işlevselliklere sahip ayrı bir katmana bölünen bir uygulamanın, kodun sürdürülebilirliğini en üst düzeye çıkarmanıza, uygulamanın farklı şekillerde dağıtıldığında uygulamanın çalışma şeklini en iyi duruma getirmenize ve belirli teknoloji veya tasarım kararlarının alınması gereken yerler arasında açık bir çizgi oluşturmanıza yardımcı olur.

Sunum, İş ve Veri Katmanları

En yüksek ve en soyut seviyede, herhangi bir sistemin mantıksal mimari görünümü, katmanlar halinde gruplandırılan bir dizi işbirliği bileşenleri olarak düşünülebilir. Katmanlı mimari 3 ayrı katmandan oluşmaktadır. Bunlar: Veri Katmanı (Data Layer), İş Katmanı (Business Process Layer) ve Sunum Katmanı (Presentation Layer) olarak sıralanabilir.

sekil


Sunum katmanı

Bu, uygulamanın en üst düzeyidir. Sunum katmanı, ürün göz atma, satın alma ve alışveriş sepeti içeriği gibi hizmetler ile ilgili bilgileri görüntüler. Tarayıcı / istemci katmanı ve ağdaki diğer tüm katmanlara sonuçları koyduğu diğer katmanlarla iletişim kurar. (Basitçe yazılımın, kullanıcıların doğrudan bir web sayfası veya bir işletim sistemi GUI gibi erişebileceği bir katmandır)

Uygulama katmanı (iş mantığı, mantıksal katman veya orta katman)

Mantıksal katman, sunum katmanından çıkarılır ve kendi katmanı olarak, detaylı bir işlem gerçekleştirerek bir uygulamanın işlevselliğini kontrol eder. Bu tabaka, sistemin çekirdek işlevselliğini uygular ve ilgili işletme mantığını kapsar. Genellikle bazıları diğer arayanların kullanabileceği servis arayüzlerini ortaya çıkarabilecek bileşenlerden oluşur.

Veri katmanı

Veri katmanı, veri yönetim mekanizmalarını (veritabanı sunucuları, dosya paylaşımları, vb.) kapsayan ve verileri açığa vuran veri erişim katmanını içerir. Veri erişim katmanı, veri depolama mekanizmalarına bağımlılıklar göstermeden veya oluşturmadan depolanan verilerin yönetim yöntemlerini ortaya koyan uygulama katmanı için bir Uygulama Programlama Arabirimi (API) sağlamalıdır. Depolama mekanizmalarına bağımlılıklardan kaçınma, uygulama katmanı istemcileri değişikliğin etkilenmesine veya farkında olmadan değişiklikleri veya güncellemeleri sağlamalıdır.Sonuçta, iyileştirilebilir ölçeklenebilirlik ve sürdürülebilirlik karşılığında, veri merkezli uygulamalar için oldukça iyi sonuçlar alabileceğiniz bir mimari katmanıdır.

Aşağıda bu yapının daha net anlaşılması için örnek bir uygulama verilmiştir. Kullanıcılar için günlüklerini tutabilecek bir uygulama planını 3 katmanlı mimari ile gerçekleştireceğiz.
Uygulamada kullanıcılar üye olabilecek, kullanıcı adı ve şifre ile günlük listelerine ulaşabilecektir. Günlük listesinden seçim yaptığında detayları görebilecektir. Daha önceden kayıtlı bir üye tekrar üye kaydı yapamayacaktır.

Öncelikle veritabanı planımızı yapalım. Söz konusu uygulamamız için kullanıcılar (users) ve günlüklerin tutulacağı (daybooks) tablolarını SQL Server üzerinde tasarlayalım.

veritabani


Tabloları oluşturmak ve sorgulamak için gereken stored procedure ‘leri sunucu üzerinde oluşturmak için aşağıdaki SQL deyimlerinden faydalanabilirsiniz.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

CREATE DATABASE DayBook
GO
USE DayBook
GO
CREATE TABLE Users(
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](80) NULL,
[Password] [nvarchar](50) NULL)
GO

CREATE TABLE Daybooks(
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [int] NULL,
[Blog] [text] NULL,
[Date] [datetime] NULL)
GO

CREATE PROCEDURE sp_Users_Get(@name nvarchar, @password nvarchar)
AS
BEGIN
SELECT * FROM Users
where Name = @name and Password=@password
END
GO

CREATE PROCEDURE sp_Users_Insert(@name nvarchar,@password nvarchar)
AS
BEGIN
INSERT INTO Users(Name,Password) VALUES(@name,@password)
END
GO

CREATE PROCEDURE sp_Users_Update(@id int,@name nvarchar,@password nvarchar)
AS
BEGIN
UPDATE Users SET Name=@name,Password=@password WHERE Id=@id
END
GO

CREATE PROCEDURE sp_DayBooks_Get(@userId int)
AS
BEGIN
SELECT *FROM Daybooks WHERE UserId=@userId ORDER BY Date
END
GO

CREATE PROCEDURE sp_DayBooks_Insert(@userId int, @blog text, @date datetime)
AS
BEGIN
INSERT INTO Daybooks(UserId,Blog,Date) VALUES(@userId, @blog, @date)
END
GO

CREATE PROCEDURE sp_DayBooks_Delete(@id int)
AS
BEGIN
DELETE Daybooks WHERE Id=@id
END
GO

CREATE PROCEDURE sp_DayBooks_Update(@id int,@blog text,@date date)
AS
BEGIN
UPDATE Daybooks SET Blog=@blog,Date=@date WHERE Id=@id
END
GO
SQL Server tarafında tablo ve kayıtlı sorgularımızı oluşturduktan sonra Visual Studio üzerinde yeni bir “Windows Form Application” oluşturarak işe başlıyoruz.



wform


Açılan Widows Form Uygulaması projemizin aynı zamanda sunum katmanı olacaktır. Bunun dışında kalan diğer katmanları oluşturmak için “Solution Explorer” üzerinde Add->New Project üzerinden “ClassLibrary” ekleyiniz. Data katmanı için “DataLibrary” iş katmanı için “BusinessLibrary” ve model sınıflarımızın içinde yeralacağı “CommonLibrary” için işlemi tekrar ediniz.

classlib.gif


solution


SQLServer ile olan bağlantı metnini App.config dosyası içine yazacağız. Dosyayı açıp <connectionStrings>..</connectionStrings> etiketlerini ekleyerek aşağıdaki şekilde düzenleyiniz.

App.Config


1
2
3
4
5
6
7
8
9
10
11

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<connectionStrings>
<add connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=DayBook;Integrated Security=True" name="DayBookConnStr"/>
</connectionStrings>
</configuration>
Söz konusu katmanların sınıflarını inşa edelim. İlk olarak veri katmanı için “DataLibrary” üzerinde “Add->New Class” üzerinden ” Database” sınıfını aşağıdaki gibi oluşturunuz.

Database.cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14

using System.Data.SqlClient;
using System.Configuration;

namespace DataLibrary
{
public class Database
{
public static SqlConnection GetConnection() {
return new SqlConnection(ConfigurationManager.ConnectionStrings["DayBookConnStr"].ConnectionString);
}
}
}
Sırada “CommonLibrary” katmanı düzenleyelim. Katmanın “DataLibrary” ile iletişime geçebilmesi için “DataLibrary”referansın alınması gereklidir. Solution Explorer üzerinde “CommonLibrary” katmanına ait “References” kısmında “Add Reference” komutu ile “DataLibrary” referansını dahil ediniz.

reference


Common katmanı üzerinde tablolarda tutulan verileri ifade edecek olan varlık sınıflarımızı oluşturalım. Model sınıflarımızı oluştururken dikkat edilmesi gereken husus sınıfa ait özelliklerin tablo alanları ile aynı veri tiplerinde olmalıdır.

User sınıfı veritabınında bulunan Users tablosundaki her bir kaydı temsil edecektir.

User.cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

namespace CommonLibrary
{
public class User
{
int _id;
string _name;
string _password;
public int Id
{
get
{
return _id;
}

set
{
_id = value;
}
}

public string Name
{
get
{
return _name;
}

set
{
_name = value;
}
}

public string Password
{
get
{
return _password;
}

set
{
_password = value;
}
}

public User()
{

}

public User(int id, string name, string password)
{
this._id = id;
this._name = name;
this._password = password;
}
}
}
Daybook sınıfı veritabanında bulunan Daybooks tablosundaki her bir satırı temsil edecektir.
 
Üst Alt