Sto cercando di decidere se utilizzare un servizio di dominio o un metodo di entità per una funzione. Si prega di consultare il codice qui sotto:
public class Customer
{
private readonly Guid _id;
private readonly decimal _expenditure;
private readonly IList<IProduct> _eligibleProducts = new List<IProduct>();
public IEnumerable<IProduct> EligibleProducts
{
get { foreach (var product in _eligibleProducts) yield return product; }
}
public void AddProduct(IProduct eligibleProduct)
{
_eligibleProducts.Add(eligibleProduct);
}
}
Il cliente aggiunge prodotti idonei alla raccolta _eligibleProducts tramite il metodo AddProduct.
Per determinare quali sono i prodotti idonei; Credo che ci siano due opzioni:
Opzione 1 - Servizio dominio
public class OfferCalculator : IOfferCalculator
{
public IEnumerable<IProduct> CalculateEligibility(Customer customer, IList<IProduct> products)
{
return products.Where(x => x.IsEligible(customer));
}
}
In questo caso il servizio applicativo otterrà i prodotti idonei dal Calcolatore dell'offerta e quindi chiamerà Cliente.Aggiungi per aggiungere singolarmente le offerte.
Se in futuro avessi voluto aggiungere altre offerte specifiche, avrei potuto farlo (credo):
BlackFridayOfferCalculator
ChristmasOfferCalculator
EasterOfferCalculator
Dovrei aggiungere un'interfaccia su un servizio di dominio chiamato IOfferCalculator per questo.
Opzione 2 - Metodo entità
Vedi il codice qui sotto, che viene aggiunto alla classe Cliente (classe cliente mostrata sopra):
public IEnumerable<IProduct> DetermineEligibility(IList<IProduct> availableProducts)
{
return availableProducts.Where(x => x.IsEligible(this));
}
Se in futuro avessi voluto aggiungere altre offerte specifiche, avrei potuto farlo (credo):
BlackFridayCustomer
ChristmasCustomer
EasterCustomer
Dovrei aggiungere un'interfaccia su un'entità chiamata ICustomer per questo.
Sto cercando di usare il principio del minimo stupore.