Sto lavorando a un nuovo design di software .NET comune (principalmente) per applicazioni di servizi Web basate su WCF con frontend client correlati (tutti scritti in C #). Finora ho scelto alcuni framework (NUnit, Autofac / Castle Windsor) come base per l'applicazione.
Ora sto facendo qualche ricerca sull'astrazione db. Sto considerando NHibernate (insieme a FluentNHibernate) come framework di persistenza. Ma ci sono alcune preoccupazioni su NHibernate.
Le interfacce database fornite dal nostro team db dev si basano molto su stored procedure e spesso usano oggetti UDT come parametri di output (a volte anche cursori ref). Molte applicazioni già esistenti utilizzano classi UDT C # generate automaticamente.
NHibernate sembra funzionare bene con Oracle (con configurazione e utilizzo appropriati di ODP.NET). Vedi Fluent NHibernate - come configurare oracle? , Fluent NHibernate: configurazione ODP di Oracle Data Provider . Anche i cursori ref e le chiamate alle stored procedure sembrano funzionare con nhibernate (vedere Chiamare una procedura di archiviazione Oracle con nHibernate e Oracle stored procedure, SYS_REFCURSOR e NHibernate ).
È appropriato utilizzare NHibernate in questo caso (procedure memorizzate e output UDT / ref cursore)? O sarebbe meglio mantenere le classi UDT C # generate automaticamente e implementare oggetti di accesso ai dati personalizzati?
Progettazione A (con classi UDT generate automaticamente):
- Crea oggetti di business nel modello di dominio (ad esempio
class Product
) - Definisci interfacce indipendenti dal database, ad es. %codice%.
- Implementalo nelle classi, ad es.
IDataAccessProduct
che rappresenta dati specifici accedere agli oggetti. Ad esempio, questa classe esegue una mappatura di classi UDT generate automaticamente (entità) a% oggetti di dominio% co_de e viceversa.
Design B (con NHibernate):
- Crea oggetti di business nel modello di dominio (ad esempio, classe di entità
OracleDataAccessProduct
.) - Aggiungi interfaccia a IProductRepository per il repository. Nel modello di dominio. Aggiungi
Product
che estende il valore es. classe baseProduct : IEntity<Product>
. - Utilizzo del mapping di ibernazione per gli oggetti dominio nella tabella db (
ProductRepository
).
Quindi quale design preferiresti?