2008-10-19 63 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,我需要这些模型全面推广。这些模型是自我包含的,对于任何其他方面都一无所知。