Lead Manager
Progetto che prevede API e Frontend,
il primo sviluppato in MVC e il secondo in Web Forms.
Configurazioni
Non ce ne ricordiamo mai.
SCADENZE
- Lead Pubblico : 5 giorni (120hours)
- Lead Privato : 30 giorni (720hour)
Sono definiti nel file Web.config del progetto LeadManager.API
Struttura
Il Frontend utilizza due livelli di astrazione: biz e dal.
- biz : La logica applicativa, mette a disposizione i modelli e quando deve recuperare informazioni dal database si affida al livello inferiore dal
- dal : Il livello basso, nel quale vengono chiamate le vere e proprie stored procedure.
- entity: Definizione delle entità tabelle usato da dal
biz e dal sono veri e propri progetti nella soluzione.
Esempio di implementazione
Dovendo implementare la nuova configurazione che permette ai negozi di filtrare le richieste in base al budget,
vogliamo costruire da zero i livelli dal e biz seguendo la struttura del progetto.
Livello Entity
Nel progetto LeadManager.Entities creare un file NomeClasse.cs nel quale
- creare una nuova classe
NomeClasse : BaseEntityche definisca esattamente i campi della tabella come property - creare una nuova classe
NomeClasse_List : BaseEntityList<NomeClasse> - creare una nuova classe
NomeClasse_SearchParameters : BaseEntitySearchParameterscon i filtri necessari per avere una get delle opzioni budget di una company - creare una nuova classe
NomeClasse_ActionParameters : BaseEntityActionParameters - aggiungere la definizione delle enum che definiscono il tipo di filtro
Avendo NomeClasse come ConfigCompanyBudget:
public class ConfigCompanyBudget : BaseEntity {
public int config_company_budgetID { get; set; }
public int companyID { get; set; }
public int? budgetID { get; set; }
}
public class ConfigCompanyBudget_List : BaseEntityList<ConfigCompanyBudget> {}
public class ConfigCompanyBudget_SearchParameters : BaseEntitySearchParameters {
public int companyID { get; set; }
}
public class ConfigCompanyBudget_ActionParameters : BaseEntityActionParameters {}
public enum ConfigCompanyBudget_SearchType {
CompleteSearch = 0,
ListSelected_by_CompanyId = 1
}
public enum ConfigCompanyBudget_ActionType {}
È possibile definire delle enum
- SearchType per specificare le tipologie di filtri di ricerca che verranno applicate prima di restituire la lista
- ActionType per definire eventuali azioni custom che non sono tra quelle base (CRUD).
Livello DAL
Nel progetto LeadManager.Dal.sql
creare una classe che estenda tutte quelle appena definite nel livello entity.
public class ConfigCompanyBudgetDal : BaseDal<ConfigCompanyBudget>, IDataLayer<ConfigCompanyBudget, ConfigCompanyBudget_List,int,ConfigCompanyBudget_SearchParameters, ConfigCompanyBudget_ActionParameters>
col compilatore di VS implementare tutti i metodi astratti e di interfaccia con il default throw new NotImplementedException().
In generale ci sono i classici metodi CRUD: CREATE, READ, UPDATE, DELETE da implementare a seconda dell'occorrenza.
Il primo metodo da implementare è RecordToEntity(),
che definisce il modello base di ritorno.
protected override ConfigCompanyBudget RecordToEntity(SqlDataReader result, Hashtable MyOrdinals) {
try {
ConfigCompanyBudget MyEntity = new ConfigCompanyBudget {
config_company_budgetID = ReadField_Integer(ref result, (int?)MyOrdinals["config_company_budgetID"]),
companyID = ReadField_Integer(ref result, (int?)MyOrdinals["companyID"]),
budgetID = ReadField_Integer(ref result, (int?)MyOrdinals["budgetID"])
};
return MyEntity;
}
catch (Exception ex) {
throw new Exceptions.LeadManager_DAL_Exception("Errore in " + global::System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
}
Il secondo è List()
che fa la classica select.
public ConfigCompanyBudget_List List(ConfigCompanyBudget_SearchParameters MySearchCriteria, int PageIndex = 0, int PageSize = 100000) {
string StoredProcedureName = "";
SqlParameter[] MyParameters = null;
switch (MySearchCriteria.SearchType) {
case (int)ConfigCompanyBudget_SearchType.ListSelected_by_CompanyId:
MyParameters = new SqlParameter[] {
new SqlParameter("@companyid", SqlDbType.Int,4) {Value = MySearchCriteria.companyID}
};
StoredProcedureName = "ConfigCompanyBudget_GetSelected_byCompany";
break;
}
try {
using (SqlDataReader result = SqlHelper.ExecSPForReader(ConnectionString, StoredProcedureName, MyParameters)) {
ConfigCompanyBudget_List arrayoggetti = new ConfigCompanyBudget_List();
Hashtable MyOrdinals = ReadOrdinals(result);
while (result.Read()) {
arrayoggetti.Add(RecordToEntity(result, MyOrdinals));
}
return arrayoggetti;
}
}
catch (Exception ex) {
throw new Exceptions.LeadManager_DAL_Exception("Errore in " + global::System.Reflection.MethodBase.GetCurrentMethod().Name + "- Stored Procedure: " + StoredProcedureName, ex);
}
}
che sta utilizzando una stored procedure ConfigCompanyBudget_GetSelected_byCompany che andremo a definire sul database.
Il terzo è Add()
che fa la classica insert.
public ConfigCompanyBudget Add(ConfigCompanyBudget record) {
string StoredProcedureName = "";
SqlParameter[] MyParameters = null;
MyParameters = new SqlParameter[] {
new SqlParameter("@companyid", SqlDbType.Int,4) {Value = record.companyID},
new SqlParameter("@budgetid", SqlDbType.Int,4) {Value = record.budgetID}
};
StoredProcedureName = "ConfigCompanyBudget_Add_byCompany";
return record;
}
utilizzando una stored procedure ConfigCompanyBudget_Add_byCompany che andremo a definire sul database.
Metodo Action()
Si utilizza quando si devono implementare azioni diverse dalle standard CRUD.
Ognuna di queste azioni vengono identificate dalla enum con _ActionType definita nel livello entity.
public void porco() {
}
Database
Creare la nuova store procedure ConfigCompanyBudget_GetSelected_byCompany
che prenda come parametro @companyID
anche definito in ConfigCompanyBudget_SearchParameters
che restituisca tutte le configurazioni budget della company selezionata
nel formato della classe ConfigCompanyBudget_List.
Creare la nuova store procedure ConfigCompanyBudget_Add_byCompany allo stesso modo.
Livello Biz
Progetto LeadManager.BIZ
Questo livello fa da tramite tra l'applicazione e il dal.
Creare una classe ConfigCompanyBudgetBiz che estenda BaseBiz come questa:
public class ConfigCompanyBudgetBiz : BaseBiz<ConfigCompanyBudget,ConfigCompanyBudget_List,int,ConfigCompanyBudget_SearchParameters,ConfigCompanyBudget_ActionParameters>
la quale può implementare qualsiasi metodo andando ad attingere al livello dal per quanto riguarda le query.