J'ai une application qui existe dans trois niveaux de présentation différents: Web, mobile (hors ligne) et Bureau (hors ligne). Les objets métier de base sont les mêmes pour les trois et partagent les mêmes règles de validation et de gestion. Cependant, ils utilisent tous des bases de données différentes (Web - SQL Server 2008, mobile/desktop - SQL Compact). Grâce à un processus de synchronisation, les applications de bureau et mobiles poussent et reçoivent des données de la base de données SQL 2008 du serveur. J'essaye de trouver la meilleure approche à n-tier et je suis un peu coincé. J'ai créé un assembly pour mes objets métier qui encapsule toutes les règles métier. J'aimerais beaucoup que chaque objet de cet assemblage ait une méthode Save(). Cependant, je ne veux pas que cette couche soit au courant d'une couche de données spécifique. Fondamentalement, je veux que les trois couches de présentation peuplent ces objets et appellent la méthode Save(). Mais je souhaite que l'implémentation de la méthode Save() soit différente en fonction de l'application appelante.Conception à niveaux multiples pour le niveau métier commun mais différents niveaux de présentation et de données
J'ai initialement créé une interface appelée IDataAdapter, puis une propriété statique sur chaque objet pour IDataAdapter. Ensuite, la méthode Save() vérifie simplement si elle a été définie, puis transmet l'objet métier à sa méthode Save().
public interface IDataAdapter
{
void Save(BusinessProxy proxy);
}
public class BusinessProxy
{
public IDataAdapter myAdapter { get; set; }
public bool Save()
{
if (myAdapter == null)
throw new Exception();
myAdapter.Save(this);
}
}
Bien sûr, ce n'est pas idéale, car la couche de présentation aurait besoin d'avoir une référence au niveau de données afin de définir la propriété de l'adaptateur. J'aimerais vraiment avoir une sorte de système de plug-in où je pourrais juste échanger le data.dll en fonction de la plate-forme de l'application.
Quelqu'un at-il des suggestions sur la façon de mettre en œuvre un peu mieux?