Niestety prace nad projektem nie idą tak jakbym sobie tego życzył. Zamiast kodować, spędziłem bardzo, bardzoo, bardzooo dużo czasu czytając znalezione w Internecie blogi i artykuły związane z wzorcami projektowymi i architektonicznymi. Tu coś o podejściu DDD, gdzie indziej o architekturze warstwowej, a jeszcze gdzieś dalej o wzorcu repozytorium. Ze względu na brak doświadczenia komercyjnego w mojej głowie powstał niemały mętlik, który nie przyczynił sie do postępu prac. Z związku z tym status projektu będzie krótki.

alt text

Moja własna architektura

W katalogu głównym projektu utworzyłem folder Models. A w nim pojawiły się następujące klasy:

  • Database - klasa reprezentująca bazę danych, której “zdrowie” będzie badane przez aplikację
public class Database
{
    public int DatabaseID { get; set; }
    public string Name { get; set; }
    public string IPAdress { get; set; }
    public bool IsActive { get; set; }
    public User Owner { get; set; }
    public virtual Engine Engine { get; set; }
}
  • Engine - klasa reprezentująca silnik bazy danych, myślę, że w początkowej fazie projektu pozostanę tylko przy MS SQL Server (MVP przede wszystkim)
public class Engine
{
    public int EngineID { get; set; }
    public string Name { get; set; }
}
  • User - klasa reprezentująca użytkownika, muszę coś wymyślić w kwestii przechowywania hasła, bo string nie jest dobrym pomysłem ;-)
public class User
{
    public int UserID { get; set; }
    public string Password { get; set; }
    public bool IsActive { get; set; }
    public List<Database> Databases { get; set; }
}
  • IDatabaseRepository - klasa reprezentująca operację CRUD na obiekcie Database
public interface IDatabaseRepository
{
    IEnumerable<Database> Databases { get; }
    
    User GetDatabaseById(int databaseId);
    void AddDatabase(User database);
    void EditDatabase(User database);
    void DeleteDatabase(int databaseId);
}
  • IUserRepository - klasa reprezentująca operację CRUD na obiekcie User
public interface IUserRepository
{
    IEnumerable<User> Users { get; }

    User GetUserById(int userId);

    void AddUser(User user);
    void EditUser(User user);
    void DeleteUser(int userId);
}
  • MockUserRepository
  • MockDatabaseRepository

Nie zaprezentowałem ciała klas “mockujących”, żeby nie zakłócić czytelności. Implementują one interfejsy odpowiednio IUserRepository oraz IMockRepository.

W założeniu aplikacja powinna dodatkowo zbierać historyczne dane o stanie bazy danych, ale w tym momencie funkcjonalność ta nie znajduje się w obrębie MVP ;-)

Po spędzeniu wielu godzin z “architekturą” niestety nie wymyśliłem nic ciekawszego. Myślę, że wraz z postępem w projekcie nadejdzie potrzeba refaktoryzacji. Jeżeli macie pomysły na poprawę powyższego stanu rzeczy czekam na komentarze :-)