So che la maggior parte (se non tutti) la logica di business dovrebbe risiedere nel proprio livello, ma qual è il consenso generale di mettere alcune logiche di business di base all'interno del livello di repository stesso?
Il mio scenario: Abbiamo una tabella che ha alcune colonne opzionali, ma se una delle colonne contiene un valore, le altre due saranno influenzate da quel valore.
Un POCO di un'entità per quella tabella assomiglia a qualcosa di simile:
public class Template
{
public int Id {get;set;}
public string MessageTemplate {get;set;}
public int? FacilityId {get;set;}
public int? ResourceId {get;set;}
public bit GlobalDefault {get;set;}
}
Ora dovrebbe esserci solo una voce che è designata come predefinita globale e, analogamente, ogni struttura o risorsa dovrebbe essere elencata nella tabella una sola volta. Gli ultimi vincoli vengono applicati da SQL Server, ma ciò richiede alcune logiche di business per assicurarsi che tutto scorra liscio.
Nel caso di questa tabella, se dovessimo tentare di inserire un nuovo record per una struttura o risorsa esistente, il record precedente dovrebbe essere aggiornato (o eliminato). Lo stesso vale per l'impostazione di un nuovo default globale. Solo un'entità dovrebbe essere l'impostazione predefinita globale, quindi se ne esiste un'altra, dovrebbe essere cancellata o aggiornata.
Ora ovviamente, il mio livello aziendale gestirà questi scenari al meglio delle loro possibilità, ma quanto è malvagio implementare anche quel livello di logica nei miei archivi stessi?
Sto immaginando qualcosa come il seguente nel mio repository:
public void InsertFacilityTemplate(Template template)
{
var existing = context.Templates.Where(n => n.FacilityId == template.FacilityId);
Template recordToSave;
if (existing.Count > 1)
DeleteRecords(existing);
if (existing.Count == 1)
recordToSave= existing.First();
if (recordToSave != null)
{
recordToSave.MessageTemplate = template.MessageTemplate;
Update(recordToSave);
}
else
Insert(template);
}
Qual è l'approccio corretto qui?