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.
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.
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.
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.
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.
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.
Daybook.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
namespace CommonLibrary { public class DayBook { int _id; User _user; string _blog; DateTime _date; public int Id { get { return _id; } set { _id = value; } } public User User { get { return _user; } set { _user = value; } } public string Blog { get { return _blog; } set { _blog = value; } } public DateTime Date { get { return _date; } set { _date = value; } } public DayBook() { } public DayBook(int id, User user, string blog, DateTime date) { this._id = id; this._user = user; this._blog = blog; this._date = date; } } } |
Veri katmanı üzerinden bağlantıya geçerek kayıtlı sorgulara parametrelerini yollayıp dönen değerleri nesnelere yerleştiren yöntemleri barındıran sınıfları oluşturalım. Her tablo için gereksinimlerimizi karşılayacak metodlar ile yazılan sınıflarımızı aşağıda örnekte verildiği gibi düzenleyiniz.
DayBookProvider.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using System.Collections.Generic; using System.Data.SqlClient; using DataLibrary; namespace CommonLibrary { public class DayBookProvider { public List<DayBook> GetAllDayBooks(User user) { List<DayBook> dayBooks = new List<DayBook>(); using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_DayBooks_Get @Id",connection); command.Parameters.Add(new SqlParameter("Id", user.Id)); connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { var dayBook = new DayBook(); dayBook.Id = reader.GetInt32(0); dayBook.User = user; dayBook.Blog = reader.GetString(2); dayBook.Date = reader.GetDateTime(3); dayBooks.Add(dayBook); } } connection.Close(); } return dayBooks; } public bool InsertDayBook(DayBook dayBook) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_DayBooks_Insert @userId,@blog,@date",connection); command.Parameters.Add(new SqlParameter("userId", dayBook.User.Id)); command.Parameters.Add(new SqlParameter("blog", dayBook.Blog)); command.Parameters.Add(new SqlParameter("date", dayBook.Date)); connection.Open(); if (command.ExecuteNonQuery() != -1) { result = true; } connection.Close(); } return result; } public bool DeleteDayBook(DayBook daybook) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_Daybooks_Delete @id",connection); command.Parameters.Add(new SqlParameter("id", daybook.Id)); connection.Open(); if (command.ExecuteNonQuery() != -1) { result = true; } connection.Close(); } return result; } public bool UpdateDayBook(DayBook daybook) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_Daybooks_Update @id,@blog,@date",connection); command.Parameters.Add(new SqlParameter("id", daybook.Id)); command.Parameters.Add(new SqlParameter("blog", daybook.Blog)); command.Parameters.Add(new SqlParameter("date", daybook.Date)); connection.Open(); if (command.ExecuteNonQuery() != -1) { result = true; } connection.Close(); } return result; } } } |
UserProvider.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
using DataLibrary; using System.Data.SqlClient; namespace CommonLibrary { public class UserProvider { public User getUser(string name, string password) { User user = null; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_Users_Get @name,@password",connection); command.Parameters.Add(new SqlParameter("name", name)); command.Parameters.Add(new SqlParameter("password", password)); connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { user = new User(); user.Id = reader.GetInt32(0); //id user.Name = reader.GetString(1); //name user.Password = reader.GetString(2); //password } } connection.Close(); } return user; } private bool ContainsUser(User user) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("SELECT *FROM Users WHERE Name='" + user.Name + "' and Password='" + user.Password + "'"); command.Connection = connection; connection.Open(); using (var reader = command.ExecuteReader()) { if (reader.Read()) { result = true; } } connection.Close(); } return result; } public bool InsertUser(User user) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_Users_Insert @name,@password", connection); command.Parameters.Add(new SqlParameter("name", user.Name)); command.Parameters.Add(new SqlParameter("password", user.Password)); connection.Open(); if (command.ExecuteNonQuery() != -1) { result = true; } connection.Close(); } return result; } public bool UpdateUser(User user) { bool result = false; using (var connection = Database.GetConnection()) { var command = new SqlCommand("sp_Users_Update @id,@name,@password",connection); command.Parameters.Add(new SqlParameter("id", user.Id)); command.Parameters.Add(new SqlParameter("name", user.Name)); command.Parameters.Add(new SqlParameter("password", user.Password)); connection.Open(); if (command.ExecuteNonQuery() != -1) { result = true; } connection.Close(); } return result; } } } |
İş katmanı (Business Library) için hazırlayacağımız sınıflar “CommonLibrary” de bulunan provider sınıflarımızdan elde ettiği nesneleri, sunum katmanına göndermek için kullanılacak metodları yapısında barındıracaktır. Bu noktada uygulama için iş mantığı gereksinimlerini rahatlıkla ele alabilirsiniz.
UserContext.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 |
using CommonLibrary; namespace BusinessLibrary { public class UserContext { private UserProvider context = new UserProvider(); public User GetUser(string Name, string Password) { return context.getUser(Name, Password); } public bool InsertUser(User user) { bool result = false; User value = context.getUser(user.Name, user.Password); if (value == null) { result = context.InsertUser(user); } return result; } public bool UpdateUser(User user) { return context.UpdateUser(user); } } } |
DayBooksContext.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 |
using System.Collections.Generic; using CommonLibrary; namespace BusinessLibrary { public class DayBooksContext { private DayBookProvider context = new DayBookProvider(); public List<DayBook> GetAllDayBooks(User user) { return context.GetAllDayBooks(user); } public bool InsertDayBook(DayBook dayBook) { return context.InsertDayBook(dayBook); } public bool DeleteDayBook(DayBook dayBook) { return context.DeleteDayBook(dayBook); } public bool UpdateDayBook(DayBook dayBook) { return context.UpdateDayBook(dayBook); } } } |
Sunum katmanı için iki ayrı form oluşturun. İlki uygulamanın ana formu olacak ve günlük sayfalarını tarihlere göre sıralayarak ve listeden seçilen günlüğün okunmasını sağlayacaktır. Ekran tasarımını aşağıda gösterildiği gibi oluşturabilirsiniz veya kendinize özgü yeni bir tasarımla yola devam edebilirsiniz.
Form1.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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
using System; using System.Collections.Generic; using System.Windows.Forms; using BusinessLibrary; using CommonLibrary; namespace DayBooksApps { public partial class Form1 : Form { public Form1() { InitializeComponent(); } User user; DayBook dayBook; List<DayBook> dayBooks; DayBooksContext context; private void button1_Click(object sender, EventArgs e) { // Günlüğe yeni kayıt yapar dayBook = new DayBook(); dayBook.Blog = textBox1.Text; dayBook.User = user; dayBook.Date = dateTimePicker1.Value; context.InsertDayBook(dayBook); guncelle(); } private void button5_Click(object sender, EventArgs e) { // Temizle dateTimePicker1.Value = DateTime.Now; textBox1.Clear(); } private void button2_Click(object sender, EventArgs e) { // Günlükteki değişikliği veri katmanına uygulatır. dayBook.Blog = textBox1.Text; dayBook.Date = dateTimePicker1.Value; context.UpdateDayBook(dayBook); guncelle(); } private void button3_Click(object sender, EventArgs e) { // Günlükten kayıt siler context.DeleteDayBook(dayBook); guncelle(); } private void Form1_Load(object sender, EventArgs e) { // Kullanıcı giriş ekranını çağırır. LoginForm lgForm = new LoginForm(); lgForm.ShowDialog(); user = lgForm.user; if (user != null) { context = new DayBooksContext(); guncelle(); } } private void guncelle() { //İşlemler sonrası sunum katmanı ile iş katmanı //arasındaki senkronu sağlar dayBooks = context.GetAllDayBooks(user); dataGridView1.DataSource = dayBooks; } private void dataGridView1_SelectionChanged(object sender, EventArgs e) { // Listeden bir seçim olduğunda günlüğü günceller if (dataGridView1.SelectedRows.Count != 0) { dayBook = dayBooks[dataGridView1.SelectedRows[0].Index]; textBox1.Text = dayBook.Blog; dateTimePicker1.Value = dayBook.Date; } } } } |
Uygulama anaformu yüklenirken kullanıcı girişini sağlayan “LoginForm” dialog penceresi olarak ekrana gelecektir. Ekran tasarımını yeni bir Windows Form penceresi ekleyerek aşağıdaki gibi bir tasarımla oluşturunuz.
LoginForm.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 |
using System; using System.Windows.Forms; using BusinessLibrary; using CommonLibrary; namespace DayBooksApps { public partial class LoginForm : Form { public LoginForm() { InitializeComponent(); } public User user; UserContext uyeIslem; private void button1_Click(object sender, EventArgs e) { // Üye ol uyeIslem = new UserContext(); user = new User(); user.Name = txtName.Text; user.Password = txtPass.Text; uyeIslem.InsertUser(user); } private void button2_Click(object sender, EventArgs e) { // Giriş Yap uyeIslem = new UserContext(); user = uyeIslem.GetUser(txtName.Text, txtPass.Text); if (user != null) { this.Close(); } else { MessageBox.Show("Üye Olmalısınız.."); } } private void button3_Click(object sender, EventArgs e) { //İptal Application.Exit(); } } } |
Uygulamanın kaynak kodunu buradan indirebilirsiniz. daybooksapps
İlgin için teşekkür ederim. O örneği daha önce görmüştüm. Benim sorum bunu katmanlı mimaride yapmak. Mesela bunu Generic List ile yapabilir miyiz ?
Merhaba, katmanlı mimari ile ilgili bir sorum daha olacak. Bir winform olduğunu düşünün. Sadece iki combobox var. Bunlar iller ve ilçeler. Anlayacağınız il seçince ilgili ilin ilçesi gelsin istiyorum. Bu konularda yeni olduğumdan benim için karanlıkta kalan noktalar var. O yüzden bir önceki mesajımda kodlar arasına açıklama eklemenizi istemiştim. Teşekkür ederim.
Belki asagidaki örnek isine yarayabilir.
http://www.ahmetcansever.com/c-2/c-access-iliskili-tablodan-veri-cekme-il-ilce-veritabani/
Merhaba, güzel anlatım olmuş. Çok işe yarayacak bir çalışma.
Peki sizden rica etsek, tüm kodların arasına ” burada şunu yapıyoruz” tarzında açıklamaları yazabilir misiniz ?
Teşekkür ederim.