C# 使用附加属性扩展组件

C# 使用附加属性扩展组件,c#,entity-framework,components,C#,Entity Framework,Components,因此,我正在考虑创建一个简单的组件,用于各种不同的项目。该组件提供了一个类(比如说一辆车),我在许多项目中使用它。该组件还具有一些功能,例如列出各种汽车的基本视图,并通过实体框架将其自身的数据持久化到数据库中 现在我的问题是,如何在项目之间扩展这个汽车组件?不同项目中的大多数汽车具有非常相似的特性,但它们都有一些额外的特性。那么,我如何将这个额外的功能(或只是属性)添加到组件中,以允许我只更新包含该组件的.dll,我以后应该改进基本组件吗?我如何使组件“意识到”其数据库中的额外列 到目前为止,我

因此,我正在考虑创建一个简单的组件,用于各种不同的项目。该组件提供了一个类(比如说一辆车),我在许多项目中使用它。该组件还具有一些功能,例如列出各种汽车的基本视图,并通过实体框架将其自身的数据持久化到数据库中

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

到目前为止,我一直在考虑两种不同的选择,但都不喜欢。首先是获取组件的最新版本,添加当前项目需要的内容并使用它。但是如果我想更新基本组件,这显然会变得很麻烦。我考虑的第二种选择是,主组件有一个指向“扩展”表的链接,该表可以在定制项目中进一步定义。或者类似的东西


正如你可能知道的,我对这一切都很陌生。因此,任何和所有的提示都非常感谢

我可能理解错了什么,但你可以有,例如:

//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
}
现在,不同的项目使用不同的扩展,如
CarComponent
HorseComponent
这样

Component  mycompo = new HorseComponent ();
在这里,我使用扩展版的组件。所以我知道什么样的与马相关的文件需要马才能访问数据库

现在,当您准备发布新版本的
组件
时,只需给他们ComponentDLL,考虑到您所做的更改考虑到了向后兼容性的概念,您不会破坏任何东西,客户端项目将继续在您的修复程序中使用其扩展版本


希望我能回答你的问题。

如果你说的EF模型是指EDMX文件,那么答案很可能是:不直接可能。您可以从另一个项目/解决方案中的现有组件派生新组件,但不能扩展EDMX=您必须为每个项目中的新组件模型创建新的EDMX,并添加其自定义项。EDMX是映射,如果您更改了类或数据库,则必须定义新的映射,并且由于EDMX是XML文件,因此无法以与使用类时相同的简单方式继承它(实际上只有一种方法可以重用现有的EDMX,但它非常有限,并且很难使用,因为Visual Studio中的设计器不支持它)

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

在代码优先的情况下,您还可以使用“默认”映射约定,如果遵循正确的命名模式(代码中的属性和类必须与数据库中的列和表具有相同的名称),则该约定将使其在映射中不做任何更改

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

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

如果您希望在新项目中只包含派生类,那么您也应该修改上下文,否则您将使用映射继承,这只会使一切变得复杂。

这就是继承的目的。将该类放在所有项目通用的单独程序集中,并在其他项目中从该类继承,根据需要添加新属性。但是继承如何影响到实体框架模型的链接?有没有一种方法可以让EF模型自动更新继承类中引入的新属性?这是什么意思?我如何让组件“意识到”其数据库中的额外列?映射基类,然后分别映射派生类中的其他属性。我的意思是,当我创建基本组件时,我还为它创建了一个EF模型,这样我就可以将对象及其所有属性持久化到数据库中。现在,如果我从bas组件继承一个新类并添加一个新属性,比如说SubwooferType,它不在主组件中,因为不是所有的汽车都有低音炮。但是所有继承类的车都有。那么,我现在如何将这个新属性与整个对象一起持久化呢?谢谢你的回答,但这并不是我想要的,主要问题是对数据库的持久化。我想我只是把我的情况解释得有点糟糕。@bobblez:weel,组件对DB有持久访问权限吗?对CarComponent具有对Component+自身字段的DB的持久访问权限。这一点对于HorseComponent也是一样的。