2011-02-28 29 views
2

如果許多類實現相同的接口,是否可以將這些接口屬性映射到一個地方?還有更多的代碼@pastebin從一個地方接口流出的NHibernate映射屬性

你可以在這裏看到類有一些通用的接口(但不是所有的接口都是通用的),我不得不重複映射。

public class PostMapping : SubclassMap<Post> 
{ 
    public PostMapping() 
    { 
     Map(x => x.Text, "Text"); 
     // coming from IMultiCategorizedPage 
     HasManyToMany(x => x.Categories).Table("PageCategories").ParentKeyColumn("PageId").ChildKeyColumn("CategoryId").Cascade.SaveUpdate(); 
     // coming from IMultiTaggedPage 
     HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate(); 
     // coming from ISearchablePage 
     Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad(); 
    } 
} 
public class ArticleMapping : SubclassMap<Article> 
{ 
    public ArticleMapping() 
    { 
     Map(x => x.Text, "Text"); 
     // coming from ISingleCategorizedPage 
     References(x => x.Category, "CategoryId"); 
     // coming from IMultiTaggedPage 
     HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate(); 
     // coming from ISearchablePage 
     Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad(); 
    } 
} 

回答

1

如果C#有完整的多繼承而不是多接口繼承,那麼這很容易。看起來最接近的是爲映射基類創建單個包裝接口來保存您的通用元素。然後,您可以創建從中繼承的特定於表的映射類。此代碼的一些內容:

public class BasePageMapping : SubclassMap<IPage> //IPage could inherit: IMultiTaggedPage, ISearchablePage 
{ 
    public BasePageMapping() 
    { 
     Map(x => x.Text, "Text"); 
     // coming from IMultiTaggedPage 
     HasManyToMany(x => x.Tags).Table("PageTags").ParentKeyColumn("PageId").ChildKeyColumn("TagId").Cascade.SaveUpdate(); 
     // coming from ISearchablePage 
     Map(x => ((ISearchablePage)x).SearchIndex, "SearchIndex").LazyLoad(); 
    } 
} 

public class PostMapping : BasePageMapping 
{ 
    public PostMapping() // don't need to specify : base() because it happens automatically 
    { 
     Table("the specific table"); 

     HasManyToMany(x => x.Categories).Table("PageCategories").ParentKeyColumn("PageId").ChildKeyColumn("CategoryId").Cascade.SaveUpdate(); 

     //Other table specific mappings: 
    } 
}