BoardGamesNook · C# · Programowanie

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:

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

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

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

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):

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

Kontroler

Jak wygląda teraz kod w kontrolerze?

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

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.

 

Jedna myśl na temat “FluentValidation – cz. 2 wzorzec fabryki

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s