实体框架插件体系结构建议

问题描述:

我正尝试使用区域和依赖注入来构建模块化的ASP.NET MVC应用程序。该应用目前包括以下项目:实体框架插件体系结构建议

  • Framework.Contracts(接口,用于身份验证服务,授权,记录)
  • 框架(身份验证服务,授权,执行...)
  • Framework.Web(MVC Web应用程序)

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

  • EmployeesPlugin.Contracts(接口为IEmployeesService)
  • EmployeesPlugin(Implentation为IEmployeesService)
  • EmployeesPlugin.MVC

我想首先使用Entity Framework Database First或Model First(因为我必须连接现有的数据库)。我的问题是我不知道如何松散地结合我的实体。我不想把它们放到一个共享的DatabaseLayer项目中。相反,我想为每个插件定义框架项目和其他实体(如员工,公司)的*实体(用户,设置,LogEntries,...)。

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

我想过创建暴露每个实体属性的接口。这些接口将被放入每个插件的项目中。像IEmployee曝光FirstNameLastName。然后我开始创建一个IEmployeeRepository以返回并创建,编辑和删除员工。但是,仅在公开IEmployee并且没有具体的课程时创建员工不起作用。

另一个问题是实体Employee包含对其他项目/插件中的实体的引用。让我们说一个员工托管一些项目。因此,我想创建一个通用的IEmployee接口,而不涉及项目和包含对项目的引用的IEmployeeProjects接口。这样一来,我可以在实现这两个IEmployee加上`IEmployeeProjects*数据库层项目中创建一个类Employee

public class Employee : IEmployee, IEmployeeProjects 
{ 
    // From IEmployee interface 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    // From IEmployeeProject interface 
    public virtual ICollection<Project> Projects { get; set; } 
} 

的问题是,我不知道如何使用实体框架,丰满的东西放在一起。

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

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

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