entity-framework - 有没有办法让 ASP.NET 5 依赖注入(inject)在没有引用的情况下解析 DbContext?

标签 entity-framework dependency-injection entity-framework-6 asp.net-core asp.net-core-mvc

我正在使用 MVC 6 进行一些原型(prototype)设计,但遇到了困境。我们的项目架构非常简单:

数据层( Entity Framework 6)
服务层(类库,引用数据层)
表示层(MVC 4,引用服务层,引用数据层)

即使在阅读(并同意)Composition Root pattern之后,我也试图使设计尽可能与原始设计相似。 。这意味着我的新 MVC 6 应用程序不知道我的 DbContext 类型。您可以猜测当我尝试将我的服务类之一注入(inject) Controller 时会发生什么:

尝试激活 My.Service.Tier.SomeService 时无法解析类型为 My.Data.Tier.DbContext 的服务。

我相信我们之前的实现(不是我编写的)通过反射(reflect) bin 文件夹中的程序集来解析 DbContext。有没有办法使用 ASP.NET 5/MVC 6 内置的新的 Microsoft.Extensions.DependencyInjection 命名空间来执行此操作(或类似的操作),这样我就可以避免硬引用我的数据层来 self 的表示层?

更新
阅读 Joe Audette 的答案后,我想出了一个非常简单的扩展方法,并将其添加到我的服务层中:

public static class ServiceCollectionExtensions
{
    public static void RegisterDbContext(this IServiceCollection services)
    {
        services.AddScoped<My.Data.Tier.DbContext, My.Data.Tier.DbContext>();
    }
}

然后,在我的 MVC 应用程序的 Startup.cs 中:

using My.Service.Tier.ExtensionNamespace;

public void ConfigureServices(IServiceCollection services)
{
    services.RegisterDbContext();
}

最佳答案

我认为在内置 DI 中,您需要的所有内容都必须向 DI 服务注册。

为了将数据引用排除在 MVC 应用之外,您可以在服务层中使用 IServiceCollection 扩展方法来注册 dbcontext,或者依次调用数据层上的扩展方法。

这样您的 mvc 应用程序只需在服务层上有一个引用。

关于entity-framework - 有没有办法让 ASP.NET 5 依赖注入(inject)在没有引用的情况下解析 DbContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34910589/

相关文章:

c# - Entity Framework 6 : Multicolumn unique index featuring navigation property

entity-framework - 错误 "Failed to set database initializer of type MyNamespace.MyCustomInitializer, MyAssembly"无法加载 MyContext 类型

c# - 使用 linq 和 Entity Framework 创建适当的模型

c# - 如何修改在 Azure Functions 中 native 注入(inject)的 IConfiguration

angularjs - 在 AngularJS 中以编程方式在运行时替换服务

c# - 属性…类型…上的 Entity Framework ForeignKeyAttribute无效

c# - 通过关联表的 Entity Framework 1to1 关系在 EDMX 中不起作用

c# - 在处置 DbContext 时使用 EntityFramework 导航属性

c# - 如何正确使用依赖注入(inject)?

c# - Entity Framework 模型中的集合未更新