Dove si trova il codice quando viene chiamato da più fonti?

0

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).

    
posta Wayne Molina 20.07.2017 - 15:46
fonte

1 risposta

2

Se più fonti fanno riferimento a diversi progetti nella stessa soluzione, considera la possibilità di creare un nuovo progetto come "Componente condiviso", quindi aggiungere altri progetti come riferimento. Potrebbero esserci altri componenti riutilizzabili che potrebbero andare a questo progetto "Shared Component" man mano che ci si sposta ulteriormente nello sviluppo. Questo almeno renderebbe il tuo codice più facile da mantenere a lungo termine.

    
risposta data 20.07.2017 - 16:42
fonte

Leggi altre domande sui tag