FluentValidation – cz. 2 wzorzec fabryki

W poprzednim wpisie pokazałam prosty (i przy okazji brzydki) sposób na użycie pakietu FluentValidation do walidacji danych po stronie serwera. Dzisiaj czas na refactoring.

Integracja

Zacznę od tego, że nie muszę tworzyć za każdym razem w kontrolerze nowej instancji walidatora. Mogę skonfigurować specjalną fabrykę walidatora (wzorzec fabryki). Jak by to miało wyglądać? Wystarczy, że dodam do projektu referencję do pakietu FluentValidation.Mvc5 pobranego z nugeta:

mvc5.JPG

oraz w pliku Global.asax.cs w metodzie Application_Start() dodam linijkę kodu:

<br>
public class MvcApplication : HttpApplication<br>
{<br>
	protected void Application_Start()<br>
	{<br>
		//some code<br>
		FluentValidationModelValidatorProvider.Configure();<br>
	}<br>
}<br>

Sam walidator zostaje bez zmian. Dla przypomnienia podrzucam powstały podczas wcześniejszych prac kod walidatora:

<br>
public class GameTableValidator : AbstractValidator&lt;GameTableViewModel&gt;<br>
{<br>
	public GameTableValidator()<br>
	{<br>
		RuleFor(gameTable =&gt; gameTable.City)<br>
			.MinimumLength(3).WithMessage("Miasto musi mieć minimum 3 znaki!")<br>
			.Matches("^[a-zA-Z\\s]+$").WithMessage("Miasto musi się składać z liter!");<br>
	}<br>
}<br>

Teraz wystarczy dla danej klasy przypisać walidator. Używaliśmy go dla klasy GameTableViewModel, więc teraz wystarczy, że do tej klasy dodamy odpowiedni atrybut  o nazwie Validator ze wskazaniem typu – czyli odpowiedniej klasy walidatora (w naszym przypadku GameTableValidator):

<br>
[Validator(typeof(GameTableValidator))]<br>
public class GameTableViewModel<br>
{<br>
	public int Id { get; set; }<br>
	public string Name { get; set; }<br>
	public string CreatedGamerId { get; set; }<br>
	public string CreatedGamerNickname { get; set; }<br>
	public int MinPlayers { get; set; }<br>
	public int MaxPlayers { get; set; }<br>
	public bool IsPrivate { get; set; }<br>
	public string City { get; set; }<br>
	public string Street { get; set; }<br>
}<br>

Kontroler

Jak wygląda teraz kod w kontrolerze?

<br>
[HttpPost]<br>
public JsonResult Add(GameTableViewModel model)<br>
{<br>
	if (ModelState.IsValid)<br>
	{<br>
		//do logic<br>
	}<br>
	var joinedErrors = string.Join(" ",<br>
		ModelState.Values.SelectMany(x =&gt; x.Errors.Select(y =&gt; y.ErrorMessage)));<br>
	return Json(joinedErrors, JsonRequestBehavior.AllowGet);<br>
}<br>

Zamiast pobierać stan modelu i jego komunikaty błędów z obiektu walidatora (tak jak pokazywałam w poprzednim wpisie), pobieram te dane z obiektu ModelState.

Sprawdźmy działanie kodu!

Przypadek testowy 1

Dla danych (w polu Miasto wpisane a):

example1.JPG

wyświetla się błąd:

error1.JPG

Przypadek testowy 2

Dla danych (w polu Miasto wpisane 1):

example2

wyświetla się błąd:

error2

Widać, że działa dokładnie tak samo, jak we wcześniejszej wersji. Tylko teraz kod jest lepiej napisany.

 


Podoba Ci się to, co tworzę? Chcesz dostawać informacje o:
– wydarzeniach, które organizuję lub wspieram (np. konferencje, meetupy, webinary)
– inicjatywach, które organizuję lub wspieram (np. GeekWeekWro, DevAdventCalendar)
– moich prelekcjach, kursach i szkoleniach
– wyróżnionych artykułach z mojego bloga

0% SPAMu, 100% informacji! Krótko i na temat.

Jedna uwaga do wpisu “FluentValidation – cz. 2 wzorzec fabryki

  1. Pingback: FluentValidation – cz. 3 testy i nullowalna properta – programmer-girl

Dodaj komentarz