2008-10-19 5 views
0

J'écris un petit programme. L'interface que j'écris pour contrôler chaque référentiel créé définit une méthode de Save (IPublicObject). J'utilise LINQ pour la version SQL du référentiel CRUD. Ma question est la suivante. Je voudrais avoir seulement la méthode qui accepte le type d'interface. Je veux penser comment je peux mieux localiser l'action Enregistrer pour le type hérité que je passe ensuite.LINQ, Polymorphisme, MetaDataMapping, Inheritance Mapper

Dans le livre, je lis Patterns of Enterprise Application Architecture. Je m'appuie sur l'héritage de Maping. Je crée donc un objet dérivé de

pubic class ConcretePublicObjectOne : IPublicObject{} 

Je veux passer ensuite ceci dans la Save fonction du respository et il est à ce stade, je suis en train de penser la meilleure façon de dire, ok, nous devons utiliser « QU'EST-CE ? " Enregistrer la méthode etc ...

Dois-je utiliser un registre, paramètre de configuration mappant les types?

Vive l'aide à l'avance

Andrew

Répondre

3

Pour LINQ-to-SQL, le contexte de données fait déjà beaucoup de mappage pour vous. En tant que tel, je pense que les génériques pourraient être le meilleur moyen de réaliser une sauvegarde tout en ayant un peu de considération pour votre interface (même si je ne suis pas sûr de ce que l'interface vous donne dans ce scénario ...).

Vous pouvez accéder à l'aspect générique des données contexte via GetTable<T>():

static void Save<T>(T item) 
     where T : class, IPublicObject 
    { 
     using (DataContext ctx = GetDataContext()) 
     { 
      Table<T> table = ctx.GetTable<T>(); 
      // for insert... 
      table.InsertOnSubmit(item); 
      // for update... 
      table.Attach(item, true); 
      // for delete... 
      table.DeleteOnSubmit(item); 

      ctx.SubmitChanges(); 

     } 
    } 

Notez que le type inférence devrait signifier que vous n'avez pas besoin de spécifier le T lors de l'enregistrement:

Foo foo = new Foo(); 
    Save(foo); // <Foo> is inferred 

Est-ce une utilisation?

+0

Bravo pour ça. –

0

Qu'est-ce que vous voulez faire est d'avoir un:

Repository.Save(publicObject) 

et le dépôt d'appeler une méthode de publicObject?

Si cela est l'exigence alors vous pouvez définir la méthode Enregistrer dans le référentiel comme:

public class Repository { 
    public void Save(IPublicObject publicObject) { 
     publicObject.Save(); 
    } 
} 

où IPublicObject est défini comme:

public interface IPublicObject { 
    void Save(); 
} 

Mais cette approche vous devez définir une save method pour chaque entité (comme ConcretePublicObjectOne dans votre exemple)

0

Marc Gravell:

Merci pour cela. Comme je le dis bien, je pense que si vous utilisez votre exemple, je devrais garder les modèles que je reçois du datacontext qui me lie en quelque sorte à LINQ.

Ce que vous avez fait cependant est exactement le genre de chose que je cherche. Il trouve le type basé sur l'objet, puis sait quelle action valider. En utilisant votre exemple, pourrais-je utiliser des types anonymes pour appliquer une transformation à mes modèles afin de travailler avec ce code linq. J'ai différents mdiums de stockage que vous voyez et dont j'ai besoin de mannequins à travers le tableau.Les modèles sont de type autonome et ne savent rien de rien à côté d'eux lol.