IDesign AddDbContext是否具有接口?

时间:2018-09-29 05:19:55

标签: c# asp.net-core entity-framework-core

我正在尝试使用Razor页面创建一个新的asp.net核心Web应用程序。我想将数据库上下文添加到startup.cs文件中,但是我使用的是IDesign。

我的DbContext实体在一个我不允许引用的项目中。我需要以某种方式在访问者层或其他地方添加我的上下文。我对.net核心的服务工作方式并不十分熟悉。

我有一个这样的解决方案:

  1. 客户项目
    1. 带有cshtml文件,startupcs的项目以及所有这些都在这里
    2. 只能引用经理和公用事业项目
  2. 经理人项目
    1. 用于将调用链接到引擎/访问器以完成较高级别的任务
    2. 用于拨打访问者的电话
    3. 只能引用访问器,引擎和实用程序项目
  3. 引擎项目
    1. 用于业务逻辑
    2. 只能引用访问器和实用程序项目
  4. Accessors项目
    1. 资源访问器。点击数据库/服务。
    2. 这是我的dbcontext类所在的地方
    3. 除了实用程序之外,什么都不能引用
  5. 公用事业项目
    1. 用于存储适用于所有项目的全局类和实用程序功能
    2. 什么都不能引用

我的问题是,如果我的DbContext驻留在accessors项目中,那么我该如何将其从管理者那里传递出去,以便可以在客户端中使用它?以前有没有人有经验?

重申一下,我知道我可以轻松地在clients项目中引用accessors项目并从那里使用dbcontext。我的问题是,我想避免能够引用访问器,以免其他使用此代码的人无法看到任何访问器类。

2 个答案:

答案 0 :(得分:0)

您可以将DbContext相关类添加到新项目中,而不必包含“ Accessors”项目的各个部分。它将类似于“实用程序”项目,所有项目都可以使用/引用该项目。这样,您的“客户”项目就知道DbContext对象是什么以及如何使用它,但它却不知道如何获取对象(除非它具有连接字符串并直接使用{{ 1}}类)。这将由“经理”或“访问者”项目负责。

引用链将如下所示:

答案 1 :(得分:0)

因此,我可以按照以下指南完成此任务:https://asp.net-hacker.rocks/2017/03/06/using-dependency-injection-in-multiple-projects.html

我没有从客户端添加所有服务,而是能够使用扩展类从管理器添加这些服务,并从客户端调用该扩展方法。

客户代码:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddManagerDependencyInjection();
        services.AddGroupManagementDbContext();
        // etc...
    }

经理代码:

public static class IServiceCollectionExtension
{
    public static IServiceCollection AddManagerDependencyInjection(this IServiceCollection services)
    {
        services.AddTransient<IAccessor, Accessor>();
        return services;
    }

    public static IServiceCollection AddDbContext(this IServiceCollection services)
    {
        var connection =
            @"Server=(localdb)\mssqllocaldb;Database=DbName;Trusted_Connection=True;ConnectRetryCount=0";

        services.AddDbContext<MyContext>(
            options =>
                options.UseSqlServer(connection));
        return services;
    }
}