Il mio modello di dominio fornisce ad es. seguente oggetto Report : IEntity<Report>
. Solitamente recupero l'oggetto tipo definito dall'utente Oracle (oi tipi di raccolta) dalle stored procedure. Per tutti i tipi, le classi C# vengono generate dalla Procedura guidata classe personalizzata di Visual Studio ODP.NET. Quindi ho la seguente classe:Come integrare ODP.NET nelle classi del repository?
public class UDT_REPORT : INullable, IOracleCustomType, IXmlSerializable {
private bool m_IsNull;
private decimal m_REPORT_ID;
private decimal m_VALUE;
// etc
}
Attualmente sto cercando di creare un nuovo livello di accesso ai dati per un'applicazione C#. Vorrei applicare il modello di repository in questo caso per ottenere un accoppiamento lento e una migliore testabilità. Ma come integrare queste classi generate in repository? Come progettare la classe ReportRepository
?
public interface IReportRepository
{
Report Find(ReportId id);
IList<Report> FindAll();
void Store(Report Report);
}
Devo utilizzare il seguente approccio? Una classe proxy DB statico che, ad es. espone un metodo generico Read<T>()
con un determinato delegato per il recupero e la mappatura dei dati. E una fabbrica per la creazione del provider db.
public static T Read<T>(string sql, Func<IDataReader, T> fetch, object[] parms = null)
{
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
using (var command = factory.CreateCommand())
{
// Add connection; sql command text;
// add parameters via some extension method
// Open and close connection
T t = default(T);
var reader = command.ExecuteReader();
if (reader.Read()) {
t = fetch(reader);
}
return t;
}
}
}
E il seguente delegato viene utilizzato per il recupero del relativo oggetto UDT e il suo mapping sull'oggetto dominio, ad es. Report
.
private static Func<IDataReader, Customer> Fetch = reader =>
{
UDT_REPORT report = reader.GetValue(reader.GetOrdinal("out_param_report"));
Report report = Mapping.Map(reportEntity);
return report;
};
Cosa ne pensi di questo approccio? Esistono approcci migliori per l'integrazione dei tipi di ODP.NET nei repository? O dovrei evitare di generare classi UDT e aggiungere invece un frame ORM?
Grazie per avermi fornito alcune informazioni sull'implementazione dell'accesso ai dati. Attualmente non sto usando EF. Le mie classi Entity sono classi C# generate da Oracle Developer Tools per Visual Studio (Custom Class Wizard). Devo fare affidamento sulle stored procedure come interfaccia (politica di sicurezza). Le procedure memorizzate e EF potrebbero funzionare con i cusori di riferimento come parametri di output. I campi del cursore possono essere mappati alle entità. Non c'è modo di mappare oggetti Oracle UDT in entità EF. –
Cercherò di evidenziare alcuni fatti sulla situazione attuale: - Sono richieste procedure memorizzate (nessun parametro/sql dinamico). - La maggior parte delle procedure restituisce oggetti ([oggetti UDT Oracle] [1]) - Le classi C# generate da Oracle Visual Studio Tools vengono utilizzate come classi di entità. - Attualmente non viene utilizzato alcun ORM (nessun EF/nessun nibernetico). [1] http://docs.oracle.com/html/E10927_01/featUDTs.htm E vorrei migliorare la progettazione del codice di accesso ai dati. –