实体框架插件架构建议

时间:2012-08-29 07:12:54

标签: asp.net-mvc-3 entity-framework plugins mef repository-pattern

我正在尝试使用区域和依赖注入构建模块化的ASP.NET MVC应用程序。该应用程序目前包含以下项目:

  • Framework.Contracts (身份验证服务,授权,日志记录的接口)
  • 框架(认证服务,授权,......的实施)
  • Framework.Web (MVC Web应用程序)

每个插件都包含一个MVC Area项目,合同和服务实现:

  • EmployeesPlugin.Contracts (IEmployeesService的接口)
  • EmployeesPlugin (为IEmployeesService实施)
  • EmployeesPlugin.MVC

我想使用Entity Framework Database First或Model First(因为我必须连接现有数据库)。我的问题是我不知道如何松散地耦合我的实体。我不想将它们放入一个共享的DatabaseLayer项目中。相反,我想为Framework项目定义中心实体(User,Settings,LogEntries,...)以及为每个插件定义其他实体(如Employee,Company)。

阅读ORM Architecture: One or Multiple Models (Entity Framework)后,我考虑创建多个模型(即多个数据上下文)。实际上我不喜欢冗余代码的想法。

我考虑过创建公开每个实体属性的接口。这些接口将按插件放入项目中。与展示IEmployeeFirstName的{​​{1}}一样。然后我开始创建一个LastName来返回并创建,编辑和删除Employees。但是,在仅公开IEmployeeRepository而没有具体类时,创建员工不起作用。

另一个问题是实体IEmployee包含对其他项目/插件中的实体的引用。让我们说一个员工主持了许多项目。因此,我想创建一个通用的Employee接口而不引用项目,并创建一个IEmployee接口,其中包含对项目的引用。这样我就可以在中央数据库层项目中创建一个类IEmployeeProjects来实现Employee添加`IEmployeeProjects:

IEmployee

问题在于我不知道如何使用Entity框架将各种东西融合在一起。

1 个答案:

答案 0 :(得分:1)

你通过消除它们之间的任何硬关系来创造松散的偶然。相反,只需使用ID来引用其他实体。这也意味着每个插件都使用它自己的DbContext。

然后在每个插件中使用存储库来加载引用的实体。这也意味着每个插件都必须在一个单独的程序集中定义它们的存储库接口,这些接口可以被其他插件使用。

我通常还会创建一个核心对象,在其中我定义核心公开的所有entites,服务和存储库。