.Net Core Fluent Validation Kullanımı

Posted by

Merhaba Arkadaşlar, .Net Core Fluent Validation Kullanımı konusundan bahsedeceğim.

Uygulamalarımızı tasarlarken veri girişi işlemleri sağlanırken istediğimiz verilerin doğruluğunu sağlayabilmek ve uygulamaların güvenliğini sağlayabilmek için verileri doğrulamamız gerekir. Örnek vermek gerekirse kullanıcı kayıt işleminde e-mail adresinin zorunlu tutulması, e-mail adresine uygun bir yapının girilmesi, kullanıcı giriş sayfasında kullanıcı adı veya e-mail adresi ve şifresinin boş geçilememesi gibi örnekleri verebiliriz.

Fluent Validation da bizim için belli kuralların tanımlanmasıyla validasyon işlemlerini sağlar. Fluent Validation esnek yapısı sayesinde karışık olan kuralların da anlaşılır olmasını sağlar. İstersek eğer Data Annotation‘ları kullanarak da bu validasyon kurallarını ekleyebiliriz fakat SOLID prensiplerinden olan “Single Responsibility Principle” yani tek sorumluluk prensibine aykırıdır.

Tanımları ve bilgileri anlattıktan sonra bir örnek ile Fluent Validation kullanımını gerçekleştirelim.

.Net Core 6 ile bir web projesi oluşturuyoruz.

Fluent Validation kullanımını sağlayabilmek için Nuget Package Manager üzerinden FluentValidation.AspNetCore paketini yüklüyoruz.

Paket yüklemesini de yaptıktan sonra işlemlerimizi gerçekleştirelim.

Ürün bilgilerinin tutulması için bir model class’ı oluşturuyoruz.

public class Product
{
	public int Id { get; set; }
	public string Name { get; set; }
	public decimal Price { get; set; }
}

Modelimizi oluşturduktan sonra kurallarımızı yazacağımız class’ımızı oluşturuyoruz.

Ürün ile ilgili işlemlerimiz için de bir Interface ve bir Class oluşturuyoruz.

public interface IProductService
{
	List<Product> GetProducts();
	Product GetProductById(int id);
	void Add(Product product);
}

public class ProductService : IProductService
{
	List<Product> _products;
	public ProductService()
	{
		_products = new List<Product>();
		_products.Add(new Product { Id = 1, Name="Ürün 1", Price = 1000 });
		_products.Add(new Product { Id = 2, Name="Ürün 2", Price = 2000 });
		_products.Add(new Product { Id = 3, Name="Ürün 3", Price = 3000 });
		_products.Add(new Product { Id = 4, Name="Ürün 4", Price = 4000 });
		_products.Add(new Product { Id = 5, Name="Ürün 5", Price = 5000 });
	}

	public void Add(Product product)
	{
		_products.Add(product);
	}

	public Product GetProductById(int id)
	{
		return _products.Find(x => x.Id == id);
	}

	public List<Product> GetProducts()
	{
		return _products;
	}
}

Yukarıda Ürün listelemesi, Id’ye göre sorgulamasını ve eklemesini yapan metotlarımızı yazıyoruz. Bu işlemlerden sonra da Validasyon kontrolleri için ProductValidator class dosyamızı oluşturuyoruz.

ProductValidator.cs

public class ProductValidator : AbstractValidator<Product>
{
	public ProductValidator()
	{
		RuleFor(x=> x.Name)
			.NotEmpty()
			.WithMessage("Ürün adı boş geçilemez!")
			.MinimumLength(3)
			.WithMessage("Ürün adı minimum 3 karakter olmalıdır!");

		RuleFor(x => x.Price)
			.NotEmpty()
			.WithMessage("Fiyat bilgisi boş geçilemez!")
			.GreaterThan(0)
			.WithMessage("Fiyat bilgisi sıfırdan farklı olmalıdır!");
	}
}

Yukarıdaki gibi ProductValidator class’ımızı oluşturduktan sonra constructor içerisinde kurallarımızı RuleFor ile tanımlıyoruz. Burada Name bilgisinin boş geçilemeyeceğini ve minimum 3 karakter alacağını belirttik. Fiyat bilgisi için de Price alanının boş geçilemeyeceğini ve sıfırdan büyük olması gerektiği kurallarını belirttik.

Ürün eklemesi yapacak sayfamızın View dosyasını oluşturuyoruz.

@model FluentValidationSample.Models.Product

@{
    ViewData["Title"] = "Add";
}

<h1>Add</h1>

<h4>Product</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Add">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Price" class="control-label"></label>
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-action="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View kısmını da oluşturduk şimdi controller tarafında kodlarımızı oluşturuyoruz.

public IActionResult Add()
{
    return View(new Product());
}

[HttpPost]
public IActionResult Add(Product product)
{
    if (ModelState.IsValid)
    {
        _productService.Add(product);

        return RedirectToAction("Index","Product");
    }

    return View(product);
}

Controller’da ModelState.IsValid kontrolünü yapıyoruz.

Son olarak da FluentValidation ile ilgili eklemeyi Program.cs dosyamıza yazıyoruz.

.Net Core 6’dan önceki versiyonlarda da Startup.cs dosyamıza bu eklemeyi yapıyoruz.

builder.Services.AddFluentValidationAutoValidation();

builder.Services.AddScoped<IValidator<Product>, ProductValidator>();

Program.cs dosyamızın son hali aşağıdaki gibidir.

using FluentValidation;
using FluentValidation.AspNetCore;
using FluentValidationSample.Models;
using FluentValidationSample.Services;
using FluentValidationSample.Validators;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddScoped<IProductService, ProductService>();

builder.Services.AddFluentValidationAutoValidation();

builder.Services.AddScoped<IValidator<Product>, ProductValidator>();

// Add services to the container.
builder.Services.AddMvc();



var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapDefaultControllerRoute();

app.Run();

Yukarıdaki işlemler sağlandıktan sonra form üzerinden bir ürün eklemeye çalıştığımızda FluentValidation kısmında yazdığımız kurallara uymayan bir durum olursa ekranda bize gösterimini sağlayacaktır.

Umarım faydalı olur.

Bir sonraki yazıda görüşmek üzere…

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir