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

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

  • 每个插件由一个 MVC Area 项目、契约和服务实现组成:
  • EmployeesPlugin.Contracts (IEmployeesService 的接口(interface))
  • 员工插件 (IEmployeesService 的实现)
  • 员工插件.MVC

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

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

    我想过创建接口(interface)来公开每个实体的属性。这些接口(interface)将被放入每个插件的项目中。就像 IEmployee 暴露 FirstNameLastName 一样。然后我开始创建一个 IEmployeeRepository 来返回和创建、编辑和删除员工。然而,当只公开 IEmployee 而没有具体类时,创建员工不起作用。

    另一个问题是实体 Employee 包含对其他项目/插件中实体的引用。假设一名员工主持了许多项目。因此,我想创建一个没有对项目的引用的通用 IEmployee 接口(interface)和一个包含对项目的引用的 IEmployeeProjects 接口(interface)。这样我就可以在中央数据库层项目中创建一个类 Employee 来实现 IEmployee add `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 框架将事情充实在一起。

    最佳答案

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

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

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

    关于asp.net-mvc-3 - Entity Framework 插件架构推荐,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12172610/

    10-12 12:54
    查看更多