Abbiamo creato una Dll condivisa per cui raccomanderei questo approccio. Abbiamo un server Nuget privato in cui è memorizzato il componente in modo che i clienti possano ottenere nuove versioni in qualsiasi momento. Non cambia molto Quando cambia, semplicemente aggiorniamo il codice e quindi inseriamo un nuovo pacchetto Nuget. I clienti possono prendere la nuova versione dalle loro app poiché si tratta di un riferimento Nuget. Lo rendiamo compatibile all'indietro in modo che le versioni precedenti possano esistere con le versioni più recenti.
Le tue prestazioni saranno peggiori perché ora c'è un altro salto nel tuo data store se segui il percorso del servizio. Se hai molti clienti diversi, un servizio può essere una scelta migliore dal momento che sia .net che java possono utilizzare il servizio anziché una Dll specifica per piattaforma. Ma se tutti i client .Net non posso immaginare un servizio per questo.
Come @Ben ha commentato, abbiamo implementato così l'unico riferimento al bisogno del client .Net è System.Data
. Tutti gli altri riferimenti sono nel componente Dll che sarà gestito dal pacchetto Nuget. Quindi, se l'implementazione di Sql Server cambia, i client non ne sono consapevoli. Se la dll è impostata in questo modo, avrà una buona separazione delle preoccupazioni.
Implementazione del codice client di esempio:
IDbCommand command = CommandFactory.Create("GetSampleById");
command.Parameters.Add(ParameterFactory.Create("@Id", 11));
var db = new SampleReader {ConnectionString = connectionString};
var samples = db.ExecuteReader(command);
Per indirizzo @ commenti di Vincent sotto ...
Il mapping della colonna viene gestito dal client, non dall'API. L'API esegue semplicemente i comandi forniti ad esso.
Lettore: fornisce mapper.
public class SampleReader : Database<Sample>
{
protected override MapperBase<Sample> GetMapper()
{
MapperBase<Sample> mapper = new SampleMapper();
return mapper;
}
}
Mapper: esegue il mapping degli IRecords a un DTO.
IRecord appartiene a System.Data
quindi nessuna dipendenza diretta dalle dipendenze di Sql Server. Se vuoi mappare un'altra colonna, aggiungila al mappatore ...
public class SampleMapper : MapperBase<Sample>
{
private const string Id = "Id";
private const string Name = "Name";
private const string DataValue = "DataValue";
private const string Created = "Created";
protected override Sample Map(IDataRecord record)
{
return new Sample(
Utility.ConvertObjectToType<Int64>(record[Id]),
Utility.ConvertObjectToType<String>(record[Name]),
Utility.ConvertObjectToType<Int32>(record[DataValue]),
Utility.ConvertObjectToType<DateTime>(record[Created])
);
}
}
La classe di utilità appartiene all'API e gestisce le conversioni di tipo SQL Server in C #.
Naturalmente, i mapper e i lettori possono essere automaticamente generati automaticamente dalla stored procedure e / o query fornite per un tipo di applicazione ORM di peso leggero.