Nous avons actuellement une application qui récupère des données du serveur via un service Web et remplit un DataSet. Ensuite, les utilisateurs de l'API le manipulent à travers les objets qui à leur tour changent l'ensemble de données. Les modifications sont ensuite sérialisées, compressées et renvoyées au serveur pour être mises à jour.Enregistrer les données via un service Web à l'aide de NHibernate?
Cependant, j'ai commencé à utiliser NHibernate dans les projets et j'aime vraiment la nature déconnectée des objets POCO. Le problème que nous avons maintenant est que nos objets sont tellement liés au DataSet interne qu'ils ne peuvent pas être utilisés dans de nombreuses situations et que nous finissons par faire des objets POCO en double pour passer d'un endroit à l'autre.
Batch.GetBatch() -> calls to web server and populates an internal dataset
Batch.SaveBatch() -> send changes to web server from dataset
Y at-il un moyen d'atteindre un modèle similaire que nous utilisons tous les accès qui se produit de base de données via un service Web, mais utiliser NHibernate?
Modifier 1
avoir une solution partielle qui fonctionne et persistant grâce à un service Web, mais il a deux problèmes.
- je dois sérialisation et envoyer toute ma collection et non pas seulement changé les articles
- Si je tente de repeupler la collection lors du retour de mes objets alors les références que j'avais sont perdus.
Voici mon exemple de solution.
côté client
public IList<Job> GetAll()
{
return coreWebService
.GetJobs()
.BinaryDeserialize<IList<Job>>();
}
public IList<Job> Save(IList<Job> Jobs)
{
return coreWebService
.Save(Jobs.BinarySerialize())
.BinaryDeserialize<IList<Job>>();
}
côté serveur
[WebMethod]
public byte[] GetJobs()
{
using (ISession session = NHibernateHelper.OpenSession())
{
return (from j in session.Linq<Job>()
select j).ToList().BinarySerialize();
}
}
[WebMethod]
public byte[] Save(byte[] JobBytes)
{
var Jobs = JobBytes.BinaryDeserialize<IList<Job>>();
using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
foreach (var job in Jobs)
{
session.SaveOrUpdate(job);
}
transaction.Commit();
}
return Jobs.BinarySerialize();
}
Comme vous pouvez le voir, je vous envoie toute la collection au serveur chaque fois, puis retourner la collection. Mais je reçois une collection remplacée au lieu d'une collection fusionnée/mise à jour. Sans parler du fait qu'il semble très inefficace d'envoyer toutes les données d'avant en arrière quand seulement une partie de celui-ci pourrait être changé.
Edit 2
J'ai vu plusieurs références sur le web pour presque un mécanisme transparent persistant. Je ne sais pas exactement si cela fonctionnera et la plupart d'entre eux semblent très expérimentaux.
- ADO.NET Data Services w/NHibernate (Ayende)
- ADO.NET Data Services w/NHibernate (Wildermuth)
- Custom Lazy-loadable Business Collections with NHibernate
- NHibernate and WCF is Not a Perfect Match
- Spring.NET, NHibernate, WCF Services and Lazy Initialization
- How to use NHibernate Lazy Initializing Proxies with Web Services or WCF
Je vais avoir du mal à trouver un remplacement fo r le modèle DataSet que nous utilisons aujourd'hui. La raison pour laquelle je veux m'éloigner de ce modèle est qu'il faut beaucoup de travail pour lier chaque propriété de chaque classe à une rangée/cellule d'un ensemble de données.Ensuite, il couple également étroitement tous mes cours ensemble.
Quelle version de .net sont votre client et le serveur? Est-ce que vous allez avoir besoin de communiquer avec un client .net (ou avec quel couplage voulez-vous être?) –
Version 3.5 et nous n'avons pas besoin d'interagir avec autre chose que .NET. Il peut être complètement lié à .NET en ce qui me concerne. Nous construisons le client et le serveur. –