MVC Core Repository Pattern per tabelle Multiple Lookup

4

Abbiamo una tabella transazionale del cliente con più tabelle di ricerca con chiavi esterne. Vogliamo creare menu a discesa utilizzando queste tabelle di ricerca, quando CustomerService crea una transazione dell'ordine cliente. Se una persona vede le transazioni in un secondo momento, vedrebbe i 4 tavoli uniti.

Creerei

(a) 4 interfacce con 4 repository,

(b) o 2 interfacce (1 per Customer Transaction, 1 interfaccia per le tabelle di ricerca), con 1 repository per la transazione cliente e 3 repository per l'interfaccia tabella di ricerca?

Vogliamo inoltrare il Repository della tabella di ricerca alla SelectList di seguito. Ogni lista di selezione sta selezionando determinate colonne. Vuoi essere efficiente nel codice.

Modelli:

public class CustomerTransaction
{
    public int CustomerTransactionId{ get; set; },
    public int ProductTypeId {get; set; }, //joins to ProductTypeTable
    public int StatusKey {get; set; },  //joins to StatusTypeTable
    public int CustomerTypeId {get; set; } //joins to CustomerTypeTable
    public string DateOfPurchase{ get; set; },
    public string PurchaseAmount { get; set; },
}

public class ProductType
{
    public int ProductTypeId{ get; set; }
    public int Size { get; set; }
    public int Weight { get; set; },
    public string ProductName { get; set; },
    public string ProductDescription { get; set; },
}

public class StatusType
{
    public int StatusKey{ get; set; }
    public string Description{ get; set; },
    public string Symbol { get; set; },
}

public class CustomerType
{
    public int KeyNumber{ get; set; },
    public int Height{ get; set; }
    public string HairColor{ get; set; },
    public string NameOfPerson{ get; set; },
    public string ResearchNotes{ get; set; },
}

Menu a discesa campi obbligatori

ViewData["ProductTypeId"] = new SelectList(_context.ProductType, "ProductName", "ProductDescription");

ViewData["KeyNumber"] = new SelectList(_context.CustomerType , "NameofPerson", "Description");

ViewData["StatusKey"] = new SelectList(_context.StatusType, "Symbol", "ResearchNotes");
    
posta SkyPool392 21.05.2018 - 23:25
fonte

1 risposta

1

Se non hai bisogno di inserire, aggiornare o cancellare record nelle tabelle di ricerca, non preoccuparti di interfacce o repository concreti che ti consentano di farlo. Invece, aggiungi metodi o proprietà all'interfaccia della transazione del cliente per ottenere i record dalle tabelle di ricerca. Questo si traduce in proprietà aggiuntive sull'interfaccia del repository:

public interface ICustomerTransactionRepository
{
    IEnumerable<ProductType> ProductTypes { get; }
    IEnumerable<StatusType> StatusTypes { get; }
    IEnumerable<CustomerType> CustomerTypes { get; }

    void Save(CustomerTransaction transaction);
    CustomerTransaction Find(int id);
}

Non hai bisogno di 1 tabella per repository. Un repository può fornire l'accesso a tutti i dati rilevanti per un'importante entità nel tuo sistema (o Contesto Limitato se stai applicando i principi di Domain Driven Design).

Esponendo le proprietà di IEnumerable<T> per le tabelle di ricerca sull'interfaccia del repository transazioni del cliente è possibile recuperare tali record dal database per riempire i menu a discesa con le opzioni. È inoltre possibile trasferire questo oggetto repository nel livello di servizio dell'applicazione ed è funzionalmente completo, per quanto riguarda le operazioni con i clienti. L'accesso ai dati della tabella di ricerca, oltre alle operazioni CRUD per le transazioni dei clienti, rende questo "funzionalmente completo".

Se veramente volevi separare le cose, potresti dividere l'interfaccia del tuo repository in due. Uno per ottenere i dati e uno per la modifica dei dati:

public interface ICustomerTransactionRepository
    : IWriteOnlyCustomerTransactionRepository,
      IReadOnlyCustomerTransactionRepository
{
}

public interface IReadOnlyCustomerTransactionRepository
{
    IEnumerable<ProductType> ProductTypes { get; }
    IEnumerable<StatusType> StatusTypes { get; }
    IEnumerable<CustomerType> CustomerTypes { get; }

    CustomerTransaction Find(int id);
}

public interface IWriteOnlyCustomerTransactionRepository
{
    void Save(CustomerTransaction transaction);
}

Quindi puoi passare un'interfaccia che è strettamente focalizzata sul recupero delle informazioni o sulla modifica. Puoi ancora creare 1 interfaccia che erediti entrambi e implementarla in 1 classe, ma almeno ti dà una certa separazione di preoccupazioni (e "I" in SOLID: il principio di Segregazione Interfaccia).

    
risposta data 24.05.2018 - 00:23
fonte

Leggi altre domande sui tag