2010-07-13 11 views
1

Supposons que vous disposiez d'ensembles de conventions Fluent qui s'appliquent à des groupes spécifiques de mappages, mais pas à tous. Je pensais ici, je vais créer des attributs C# personnalisés que je peux appliquer aux classes Fluent * Map - et j'écris des conventions qui déterminent l'acceptation en inspectant la classe * Map pour voir si l'attribut custom a été appliqué.Utilisation d'attributs C# personnalisés pour sélectionner les conventions Fluent

De cette façon, je peux sélectionner des groupes de conventions et de les appliquer à divers applications simplement en les étiquetant avec un attribut personnalisé - [UseShortNamingConvention], etc.

Je suis nouveau NHibernate (et Fluent et C# d'ailleurs) - cette approche est-elle possible?

Et est-ce sain d'esprit? :-)

Merci!

Répondre

2

Oui c'est! J'ai en fait fait quelque chose de similaire, mais je suis allé avec des interfaces de marqueurs à la place (INotCacheable, IComponent), mais l'interface de marqueur ou l'attribut, ne devrait pas être une grande différence.

Lors de l'application de vos conventions, juste pour vérifier la présence de votre attribut et ur bon :)

EDIT:

L'ajout de quelques exemples de code

public class MyMappingConventions : IReferenceConvention, IClassConvention 
    { 
     public void Apply(IOneToManyCollectionInstance instance) 
     { 
      instance.Key.Column(instance.EntityType.Name + "ID"); 
      instance.LazyLoad(); 
      instance.Inverse(); 
      instance.Cascade.SaveUpdate(); 

      if ((typeof(INotCacheable).IsAssignableFrom(instance.Relationship.Class.GetUnderlyingSystemType()))) 
       return; 

      instance.Cache.ReadWrite(); 
     } 

     public void Apply(IClassInstance instance) 
     { 
      instance.Table(instance.EntityType.Name + "s"); 
      //If inheriting from IIMutable make it readonly 
      if ((typeof(IImmutable).IsAssignableFrom(instance.EntityType))) 
       instance.ReadOnly(); 

      //If not cacheable 
      if ((typeof(INotCacheable).IsAssignableFrom(instance.EntityType))) 
       return; 

      instance.Cache.ReadWrite(); 
     } 
} 
+0

Savez-vous comment? ... instance.EntityType me donnera le type d'entité en cours de mappage - existe-t-il une propriété qui me donnera l'EntityMapType? –

+0

Exemples de code ajoutés –