Witam, ostatnio zacząłem uczyć się wzorca MVP, ale nie jestem do końca pewny czy dobrze go rozumiem.
Tak przedstawia się kod, który napisałem.
Interfejsy:
interface ILoginPresenter
{
bool CanLogIn();
}
interface ILoginView
{
LoginData GetLoginData();
}
Modele:
class Logger
{
public LoginData LoginData { get; set; }
public Logger(LoginData loginData)
{
LoginData = loginData;
}
public bool CanLogIn()
{
var users = new UsersDataContext();
var login = LoginData.Login;
var password = LoginData.Password;
return users.Users.
Where(user => user.Login == login && user.Password == password).
Count() == 1;
}
}
public class LoginData
{
public string Login { get; set; }
public string Password { get; set; }
}
Prezenter:
class LoginPresenter : ILoginPresenter
{
private readonly ILoginView view;
public LoginPresenter(ILoginView view)
{
this.view = view;
}
public bool CanLogIn()
{
LoginData loginData = view.GetLoginData();
var logger = new Logger(loginData);
return logger.CanLogIn();
}
}
Widok:
public partial class LoginView : Form, ILoginView
{
private readonly ILoginPresenter presenter;
public LoginView()
{
InitializeComponent();
presenter = new LoginPresenter(this);
}
public LoginData GetLoginData()
{
string login = LoginTextBox.Text;
string password = PasswordTextBox.Text;
return new LoginData { Login = login, Password = password };
}
private void LogInButton_Click(object sender, EventArgs e)
{
bool canLogIn = presenter.CanLogIn();
MessageBox.Show(canLogIn ? "Można." : "Nie można.");
}
}
No i kilku rzeczy nie jestem pewny lub nie rozumiem, a mianiowicie:
- Między widokiem a prezenterem istnieje relacja jeden do jednego?
- Mogę w widoku wykorzystywać klasy z modeli - tak jak tutaj np. LoginData?
- W prezenterze powinienem używać już gotowych klas(modeli?), które mają w sobie jakąś logikę?
- Prezenter powinien działać na zasadzie prześlij z widoku do modelu i na odwrót, np. update do bazy albo pobieranie danych z bazy?
- Logika w prezenterze powinna dotyczyć tylko pośrednictwa między widokiem, a modelem?
- Pola view i presenter powinny być readonly?
- Czy moja implementacja jest poprawna? Wiem, że przykład banalny, ale chciałem się skupić na prawidłowym zrozumieniu MVP.
- W klasie LoginPresenter w funkcji CanLogIn powinienem użyć ILoginData i ILogger czy LoginData i Logger?