Mi chiedevo quale sia il modo preferito di accedere ai dati da un server in un'applicazione client. I dati verranno archiviati sul server in un database SQL e in precedenza ho utilizzato i seguenti 2 metodi per ottenere i dati:
1) Il client si connette direttamente al database SQL
2) Il client si connette a un servizio Web che esegue la query sql e quindi restituisce i dati.
Il programma in questa istanza verrà scritto in C #, quindi saranno disponibili le seguenti tecnologie:
Entity Framework (connettersi al database sql)
WCF (servizio web)
Dal punto di vista della codifica tutta la logica di accesso ai dati verrà scritta nelle classi di repository indipendentemente dal metodo utilizzato, quindi l'installazione fisica delle connessioni non dovrebbe avere alcun effetto su questo. Ad esempio un repository semplice potrebbe essere:
public interface IUserRepository
{
IList<User> GetUsers();
}
public SqlUserRepository : IUserRepositoy
{
private MyDbContext _dbContext;
public SqlUserRepository(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public IList<User> GetUsers()
{
return _dbContext.Users.ToList();
}
}
public WcfUserRepository : IUserRepository
{
IUserRepositoy _userRepository;
public WcfUserRepository(IUserRepository userRepository)
{
}
[WebGet(UriTemplate = "/users")]
public IList<User> GetUsers()
{
return _userRepository.GetUsers();
}
}
Quindi in entrambi i casi i client si baseranno solo su IUserRepository
.
Il problema che sto avendo è che l'utilizzo di WCF sembra più sicuro, e il livello extra di astrazione rende facile cambiare i provider di database. Tuttavia, quando utilizzo questa soluzione, ho sempre avuto problemi con le prestazioni e grossi problemi se viene restituito un set di dati di grandi dimensioni.
Ad esempio, se ci sono 10.000 utenti nel sistema che utilizzano il framework di entità, questo non è un problema, ma a seconda di come viene configurato WCF ciò può causare un messaggio di errore troppo grande.
Qualche opinione sulle migliori pratiche qui?
In che modo è possibile configurare WCF per ridurre la probabilità di problemi con valori di ritorno elevati?
Ovviamente WCF sarà sempre più lento di SQL diretto in quanto vi è un ulteriore passaggio di negoziazione del messaggio SOAP / REST. Ma può essere ottimizzato fino a un livello accettabile?