Sto cercando di imparare il modello di progettazione delle regole come descritto qui: link (verso il basso della pagina Web). Ho scritto una classe come questa:
public class OfferCalculator : IOfferCalculator
{
public List<IOfferRule> _rules;
public RulesOfferCalculator(List<IOfferRule> rules)
{
_rules = rules;
_rules.Add(new AgeRule());
}
public virtual List<string> CalculateOffers(Application application)
{
List<string> offers = new List<string>();
foreach (var rule in _rules)
{
offers.Add(rule.getOffer(application));
}
return offers;
}
}
e una classe come questa:
public interface IOfferRule
{
string getOffer(Application application);
}
e una classe come questa:
public class AgeRule : IOfferRule
{
public String getOffer(Application application)
{
if (application.Age >= 50)
{
return "PremierCard";
}
else
{
return "NormalCard";
}
}
}
Se l'età dei candidati è 50 o superiore, viene offerta una carta Premier e se è inferiore a 50 viene offerta una carta normale.
Ho bisogno di registrare a quale offerta hanno diritto nel database, che assomiglia a questo:
CREATE TABLE Card (id int identity not null, name varchar(100))
insert into card (name) values ('PremierCard');
insert into card (name) values ('NormalCard');
CREATE TABLE CardPerson (PersonID int not null, FOREIGN KEY (PersonID) REFERENCES Person(ID) cardid,FOREIGN KEY (CardID) REFERENCES Card(ID) int not null, primary key (personid,cardid))
CREATE TABLE Person (id int identity not null, name varchar(100))
Credo che AgeRule debba restituire un'entità di carta anziché una stringa? Come posso creare un oggetto di carta nel Business Layer? Inserisco un repository in AgeRule ed eseguo la seguente istruzione SQL (per popolare l'oggetto):
select * from card where name = 'Premiercard'
Questo non mi sembra "corretto". Come ottengo un oggetto Card nel livello dominio? C'è un modello "migliore" per questo?