2008-10-19 65 views
0

我在寫一個小程序。我正在編寫的控制每個存儲庫的接口定義了Save(IPublicObject)方法。我正在使用LINQ作爲存儲庫CRUD的SQL版本。我的問題是這個。我想只有一種接受接口類型的方法。我想考慮如何最好地找到繼承類型的保存操作,然後通過。LINQ,多態,MetaDataMapping,繼承映射器

在本書中,我正在閱讀企業應用程序體系結構的模式。我靠着繼承地圖。所以,我創建的

pubic class ConcretePublicObjectOne : IPublicObject{} 

我想要再通入程序存儲庫的保存功能此派生類對象,這是在這一點上,我試圖想如何最好地說,好吧,我們需要使用「WHAT ?」保存方法等...

我應該使用註冊表,配置設置映射類型?

乾杯提前幫助

安德魯

回答

3

對於LINQ到SQL,數據上下文已經爲你做了很多映射。因此,我認爲仿製藥可能是實現保存的最佳方式,同時仍然需要考慮您的界面(儘管我不太清楚界面在這種情況下給您提供了什麼......)。保存時

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(); 

     } 
    } 

注意,類型推斷應該意味着你不需要指定T

您可以通過GetTable<T>()訪問數據上下文的通用方面

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

是否有用?

+0

乾杯。 – 2009-02-25 10:13:20

0

你希望做的是有一個:

Repository.Save(publicObject) 

和庫調用從publicObject的方法?

如果是這樣的要求,那麼您可以在庫中定義的保存方法:

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

其中IPublicObject被定義爲:

public interface IPublicObject { 
    void Save(); 
} 

但是,使用這種方法,你必須定義一個保存每個實體的方法(例如ConcretePublicObjectOne在你的例子中)

0

Marc Gravell:

謝謝你。正如我所說,雖然我認爲使用你的例子,我將不得不保留從datacontext獲得的模型,這種模型綁定到LINQ。

你做了什麼雖然是我正在尋找的東西。它根據對象查找類型,然後知道要提交哪個操作。使用您的示例,我可以使用匿名類型將轉換應用於我的模型以使用該linq代碼。我看到了不同的商店mdeiums,我需要這些模型全面推廣。這些模型是自我包含的,對於任何其他方面都一無所知。