Okienka mają być odpowiedzialne za GUI. Tylko. Tam nie ma być żadnej logiki biznesowej. Powinieneś mieć to rozdzielone w taki sposób, że masz osobną klasę (najlepiej w osobnym projekcie) do ogarniania danych. I wszystko powinno być oparte na interfejsach. Coś takiego:
Interfejs (to może być osobny projekt "Infrastructure", w którym trzymasz wszystkie tego typu interfejsy") - taki prosty przykład:
public interface IClientDataExchange
{
void AddClient(Client c);
void DeleteClient(Client c);
void UpdateClient(Client c);
}
Klasa Client powinna być w osobnym projekcie (lub namespace): Models
Następnie powinieneś mieć klasę, która implementuje ten interfejs. Może być w projekcie DAL (DataAccessLayer):
public class DbClientDataExchange: IClientDataExchange
{
DbContext db;
public DbClientDataExchange(DbContext db)
{
this.db = db;
}
public void AddClient(Client c)
{
string sql = "INSERT INTO...";
db.AddParameter(...);
db.ExecuteNonQuery();
}
//itd.
}
I teraz tak. DbContext to jest jakaś Twoja klasa, która wykonuje już bezpośrednio przekazane zapytania. Może to być też repozytorium.
Ta klasa może też być klasą, którą będziesz testował, a więc nie powinna mieć wtedy dostępu do bazy danych, tylko do jakiegoś repozytorium właśnie. A dalej to repozytorium już sobie obrabia dane. Tutaj, dla ułatwienia, trochę to połączyłem.
Na koniec Twoja forma powinna przyjmować w konstruktorze ten interfejs:
public class Form1
{
IClientDataExchange data;
public Form1(IClientDataExchange data)
{
this.data = data;
}
void OnButtonClick()
{
Client c = new Client();
c.FirstName = firstNameEdit.Text;
//itd
data.AddClient(c);
}
}
Tak to mniej - więcej powinno wyglądać. Forma ma nie wiedzieć co musi zrobić, żeby dodać klienta. Forma ma to przekazać jakiejś innej klasie, której zadaniem jest obsługa danych. I która dokładnie wie, co ma zrobić. Forma ma tylko pokazać kontrolki i ewentualnie reagować na ich zdarzenia. Nic więcej. Forma nie powinna mieć żadnej logiki biznesowej. Te wszystkie elementy powinny być oddelegowywane do osobnych klas. To się może wydawać skomplikowane, ale bardzo ułatwia pisanie i testowanie aplikacji.