Vorrei separare il BLL da DAL come una buona pratica. Interagisco tra BLL e DAL tramite l'interfaccia. Esempio:
public interface IProductRepository
{
void Add(Product myProduct);
Product Get(string name);
Product GetById(int id);
}
dove il prodotto dell'oggetto business è:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
La classe BLL è:
public class ProductManager
{
private readonly IProductRepository productRepository;
public ProductManager(IProductRepository productRepository)
{
this.productRepository = productRepository ?? throw new Exception("message");
}
public void AddProduct(Product myProduct)
{
try
{
// Here code validation ecc....
// Add product to database
productRepository.Add(myProduct);
}
catch(Exception e)
{
// Handle exception
}
}
public Product GetProduct(string name)
{
try
{
// Here code to validation ecc....
// Get product from database
var product = _productRepository.Get(name);
return product;
}
catch(Exception e)
{
// Handle exception
}
}
// ecc ecc
}
dove DAL (vorrei usare Entity Framework) è:
public ProductRepository : IProductRepository
{
public void Add(Product myProduct)
{
using(var dbContext = MyDbContext())
{
var dbProduct = new PRODUCTS
{
NAME = myProduct.Name,
PRICE = myProduct.Price
}
dbContext.PRODUCT.Add(dbProduct);
dbContext.SaveChanges();
}
}
// ecc ecc
}
Ora ho alcune domande: - Questa è l'implementazione corretta? - Se voglio inserire un prodotto ma voglio controllare se un prodotto con lo stesso nome è su db, prima chiamo il metodo Get in BLL e poi chiamo il metodo Add (il contesto db è aperto e chiuso ogni volta, è un sovraccarico?) o posso inserire la logica in DAL come:
var dbProduct = dbContext.PRODUCTS.FirstOrDefault(p => p.NAME == name);
if(dbProduct == null) .... // insert else throw exception
In quest'ultimo caso, tuttavia, se un cambiamento dal bll logig non funzionerebbe più. -È giusto usare EntityFramework in questo modo, o perdo tutti i vantaggi di linq? Scusa, ma sono molto confuso.
Grazie.