Sto lavorando a un processo che richiede due parti diverse di esso per utilizzare un ORM (sto usando Insight.Database per questo) e non sono sicuro di dove questa parte del codice appartenga, poiché non lo sono attualmente creando un livello di astrazione su di esso ma utilizzando direttamente Insight.Database.
Un esempio del layout del codice è il seguente:
// in Program.cs
// assume we have our connection already created
var vendorInfo = connection.QuerySql("select * from dbo.Vendors where Name = @Vendor", new { Vendor = vendorParam });
// we use reflection to create the correct class, so we can store the class name in the database
var clientFactory = new ClientFactory();
var clientInstance = clientFactory.CreateClient(vendorInfo.ClassName); // this will give us the parent class, all of which implement the method we need
// have the client call its Process() method to do work
clientInstance.Process(vendorInfo.Query);
// in SimpleClient.cs (i.e. a client implementation)
// Each client implementation inherits from a base class and knows how to process itself, so different requests can do different things.
// Each class has a query defined in the database that tells it how to retrieve the specific data it needs, so recompiling/redeploying code is not needed
override void Process(string query)
{
// This is the part that I am unsure about, as this class also needs
// to call Insight.Database to retrieve the data it needs to work with.
// again, assume we have our connection already
var data = connection.QuerySql(sql);
// ... do work with the data here ...
}
Ora, il problema indicato dal commento sopra è che ho più di una classe (potenzialmente infinita, quante sono le implementazioni del client) che deve usare Insight.Database per eseguirne alcune (di solito solo una, ma potrebbe essere più di una) query. Se stavo usando un repository o simili, questo non sarebbe un problema e potrei semplicemente passare l'interfaccia del repository, ma sto usando Insight.Database senza alcun wrapper.
Quindi la mia domanda è: dovrei inserire Insight.Database nel proprio progetto e quindi ri-implementare le firme dei metodi che Insight.Database espone (che internamente chiamerebbe semplicemente Insight.Database) o qualcos'altro? Non penso di poter creare l'implementazione del client e passare i dati reali di cui ha bisogno perché sarà sempre diverso (infatti il codice reale dovrà restituirlo come DataTable non elaborato poiché può contenere praticamente qualsiasi cosa come definito dalla query corrispondente e l'idea è di rendere il codice di consumo il più generico possibile per ridurre al minimo l'aggiunta o la modifica del codice).