Questa sarà una domanda un po 'astratta.Come evitare la duplicazione del codice durante la modellazione di una tabella, il suo layout e i relativi record, che condividono tutti la stessa struttura di base?
Sto lavorando su un framework di Data Access Layer che deve distinguere tra una tabella, il suo schema/layout astratto e i record di tabella concreti. Temo che a causa di questa distinzione, ci sarà molta duplicazione del codice. Potrei aver bisogno di alcuni suggerimenti su come evitare questo.
+-----------+
| Foo |
+-----------+
| +Id: Guid |
+-----------+
noti che questo schema potrebbe descrivere qualsiasi di questi: uno schema di tabella, una tabella di cemento, o un record della tabella calcestruzzo, avente un campo Id
con tipo Guid
.
- Tutto ciò che è noto nello schema è il nome e il tipo del campo.
- Nella tabella concreta (aperta), l'"indice di colonna" del campo è inoltre noto.
- Con i record, tutte queste cose sono note e il campo ha un valore concreto.
Traducendo questo codice, otterrei molti tipi simili (in coppie di tre). Userò le interfacce per mantenere l'esempio breve; quello che voglio mostrare è la somiglianza dei tipi:
// these interfaces only need to be implemented once:
interface ISchemaField<T> { string Name { get; } }
interface ITableField<T> { string Name { get; }
int Index { get; } }
interface IRecordField<T> { string Name { get; }
int Index { get; }
T Value { get; set; } }
// these three interfaces are an example for one entity; there would be
// three additional types for each additional entity.
interface IFooSchema
{
ISchemaField<Guid> Id { get; }
IFooTable Open(IDbConnection dbConnection, string tableName);
}
interface IFooTable
{
ITableField<Guid> Id { get; }
ICollection<IFooRecord> ExecuteSomeQuery();
}
interface IFooRecord
{
IRecordField<Guid> Id { get; }
}
Ora vorrei evitare di dover scrivere tre implementazioni molto simili per ogni entità in un modello di dati concreti. Quali sono alcuni modi possibili per ridurre la duplicazione del codice?
ho pensato di generazione di codice (ad esempio T4), che sarebbe una soluzione bene, ma io preferirei una soluzione "manualmente" in codice (se ne esiste uno) con un minor numero di righe di codice più leggibile & codice.
Ho pensato di creare una classe per entità che implementa lo schema, la tabella e l'interfaccia di registrazione tutti allo stesso tempo ... ma ciò sembra disordinato e come una violazione di Separation of Concerns.
Stai usando Entity Framework? – TheBoyan
@Bojan, no. Sto creando un framework DAL personalizzato su un'API (ArcObjects ESRI) che non è supportato da Entity Framework, né da NHibernate, né da qualsiasi altro OR/M che conosca. – stakx
Solo un breve sguardo al tuo schema mi fa domandare perché non ci sia ereditarietà tra le tre interfacce dello schema? Sembra che duplichi semplicemente i metadati invece di ereditarli. –