Crea un oggetto entità nel livello dominio quando l'ID è sconosciuto

1

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?

    
posta w0051977 10.07.2017 - 14:59
fonte

1 risposta

1

Se modellate le carte con un ID e un nome, dove ID è la chiave primaria e name una chiave secondaria, quest'ultima può essere utilizzata per selezionare l'oggetto giusto e l'ID. Nell'esempio, name è probabilmente l'unico criterio sensibile da cui è possibile determinare quale delle due possibili entità di carta è quella corretta. Quindi non c'è nulla di intrinsecamente sbagliato nell'ottenere un oggetto di carta usando un'istruzione come select * from card where name = 'Premiercard' .

Tuttavia, se il tavolo da gioco è prepopolato con tutte le entità di carte disponibili e le carte non cambiano durante la vita della tua applicazione, un'alternativa potrebbe essere quella di selezionare tutte le entità di carte disponibili dal database una volta avviato il programma, memorizzarle in una lista da qualche parte e riutilizzare questi oggetti ogni volta che viene chiamato AgeRule.getOffer . Quindi nessuna chiamata al database aggiuntiva viene attivata in AgeRule.getOffer , proprio come ora dove restituisce le stringhe.

    
risposta data 10.07.2017 - 15:46
fonte

Leggi altre domande sui tag