扩展具有其他属性的组件

时间:2012-01-13 13:44:44

标签: c# entity-framework components

所以我正在考虑创建一个我将在各种不同项目中使用的简单组件。该组件提供了我在许多项目中使用的类(比如说汽车)。该组件还包含用于列出各种汽车的基本视图,并通过实体框架将其自己的数据保存到数据库中。

现在我的问题是,如何在项目之间扩展这个汽车组件?不同项目中的大多数汽车具有非常相似的属性,但它们都有一些额外的。那么我该如何将这个额外的功能(或只是属性)添加到组件中,这样我才能更新包含组件的.dll,以后我可以改进基本组件?如何让组件“了解”其db中的额外列?

到目前为止,我一直在考虑两种不同的选择,但也不喜欢。首先是采用最新版本的组件,添加当前项目所需的东西并使用它。但是,如果我想更新基本组件,这显然很麻烦。我想到的第二个选择是主要组件有一个“扩展”表的链接,然后可以在自定义项目中进一步定义。或者沿着这些方向发展。

你可能会说,我对这一切都很陌生。所以任何和所有提示都非常感谢!

2 个答案:

答案 0 :(得分:0)

可能是我误解了一些东西,但你可以拥有,例如:

//Component.DLL
public class Component 
{
   //basic functionality
}

//CarComponentDLL
public class CarComponent : Component 
{
  //extend component for cars 
}

//HorseComponentDLL
public class HorseComponent : Component
{
  //extend component for horses
}

现在,不同的项目使用不同的扩展程序,例如CarComponentHorseComponent,如此

Component  mycompo = new HorseComponent ();

这里我使用扩展为我的组件的马版本。所以我知道什么样的马相关的游戏需要马才能访问数据库。

现在,当你goona发布Component的新版本时,只需给它们ComponentDLL,考虑到你所做的更改是考虑到后兼容性概念,你不会破坏任何东西,客户端项目将继续在修补程序中使用扩展版本。

希望我回答你的问题。

答案 1 :(得分:0)

如果EF模型你的意思是EDMX文件那么答案很可能是:不可能直接。您可以从另一个项目/解决方案中的现有组件派生新组件,但不能扩展EDMX =您必须在添加其自定义项的每个项目中为新组件模型创建新的EDMX。 EDMX是映射,如果你改变了类或数据库,你必须定义新的映射,因为EDMX是XML文件,它不能像你用类一样简单地继承(实际上只有一种方法可以重用现有的EDMX但是它非常有限且非常难以使用,因为Visual Studio中的设计人员不支持它。

如果代码优先,您可以为基本组件定义EntityTypeConfiguration并在新项目中继承它以添加新属性。但是,您需要进行一些自定义,因为新项目中的模型构建器必须加载正确的(新)映射配置类,而不是原始项目中使用的旧映射配置类。

如果代码优先,您还可以使用“默认”映射约定,如果您遵循正确的命名模式,它将使其无需更改映射即可工作(代码中的属性和类必须与数据库中的列和表具有相同的名称)。

另一个问题是ObjectSet / DbSet。如果您的基本上下文使用类似:

public ObjectSet<Car> Cars { get; set; }

并且您希望在新项目中只有派生类,您应该修改上下文,否则您将使用映射继承,这只会使所有内容复杂化。

相关问题