4

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

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

每个插件由一个 MVC 区域项目、合同和服务实现组成:

  • EmployeesPlugin.Contracts(IEmployeesService 的接口)
  • EmployeesPlugin(IEmployeesService 的实现)
  • 雇员插件.MVC

我想使用实体框架数据库优先或模型优先(因为我必须连接现有数据库)。我的问题是我不知道如何松散地耦合我的实体。我不想将它们放入单个共享的 DatabaseLayer 项目中。相反,我想为框架项目定义中心实体(用户、设置、LogEntries,...),并为每个插件定义附加实体(如员工、公司)。

阅读ORM 架构:一个或多个模型(实体框架)后,我想到了创建多个模型(即多个数据上下文)。其实我不喜欢有冗余代码的想法。

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

另一个问题是实体Employee包含对其他项目/插件中实体的引用。假设一名员工主持了许多项目。因此,我想创建一个IEmployee没有对项目的引用的通用接口和一个IEmployeeProjects包含对项目的引用的接口。这样,我可以Employee在实现两者的中央数据库层项目中创建一个类IEmployee添加`IEmployeeProjects:

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; }
}

问题是我不知道如何使用 Entity 框架将事物组合在一起。

4

1 回答 1

1

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

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

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

于 2013-03-05T10:27:39.697 回答