Domande sul livello della logica aziendale e il livello di accesso ai dati in un progetto

1

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.

    
posta pampua84 28.01.2018 - 22:33
fonte

1 risposta

1

Se il Name di un prodotto deve essere univoco, dovrebbe esserci un vincolo univoco nel database. In caso contrario, le scritture simultanee potrebbero inserire lo stesso nome prodotto due volte nella tabella del prodotto, anche quando è presente un test nel codice client che tenta di evitarlo.

Ma se c'è un tale vincolo, testare l'unicità nel livello DAL (e lanciare un'eccezione nel caso in cui il nome del prodotto fosse usato prima) è superfluo, poiché dbContext genererà comunque un'eccezione nel caso in cui il vincolo sia violata. Pertanto, inserire tale test nel DAL non è intrinsecamente sbagliato, ma in realtà non porta alcun vantaggio reale.

    
risposta data 28.01.2018 - 23:37
fonte

Leggi altre domande sui tag