有没有办法让 ASP.NET 5 依赖注入在没有引用的情况下解析 DbContext?
Is there a way to have ASP.NET 5 Dependency Injection resolve a DbContext without a reference?
我正在使用 MVC 6 进行一些原型设计,但 运行 陷入了困境。我们的项目架构足够简单:
数据层(Entity Framework 6)
服务层(Class 库,引用数据层)
表示层(MVC 4,引用服务层,不引用数据层)
即使在阅读(并同意)Composition Root pattern 之后,我也在努力使设计尽可能与原始设计相似。这意味着我的新 MVC 6 应用程序不知道我的 DbContext
类型。你可以猜到当我尝试将我的一项服务 类 注入控制器时会发生什么:
Unable to resolve service for type My.Data.Tier.DbContext while attempting to activate My.Service.Tier.SomeService.
我相信我们之前的实现(不是我写的)通过反映 bin 文件夹中的程序集解决了 DbContext
。有没有一种方法可以使用内置于 ASP.NET 5/MVC 6 的新 Microsoft.Extensions.DependencyInjection
命名空间来执行此操作(或类似操作),这样我就可以避免从我的数据层硬引用我的数据层表示层?
更新
阅读 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 应用程序只需要在服务层上有一个引用。
我正在使用 MVC 6 进行一些原型设计,但 运行 陷入了困境。我们的项目架构足够简单:
数据层(Entity Framework 6)
服务层(Class 库,引用数据层)
表示层(MVC 4,引用服务层,不引用数据层)
即使在阅读(并同意)Composition Root pattern 之后,我也在努力使设计尽可能与原始设计相似。这意味着我的新 MVC 6 应用程序不知道我的 DbContext
类型。你可以猜到当我尝试将我的一项服务 类 注入控制器时会发生什么:
Unable to resolve service for type My.Data.Tier.DbContext while attempting to activate My.Service.Tier.SomeService.
我相信我们之前的实现(不是我写的)通过反映 bin 文件夹中的程序集解决了 DbContext
。有没有一种方法可以使用内置于 ASP.NET 5/MVC 6 的新 Microsoft.Extensions.DependencyInjection
命名空间来执行此操作(或类似操作),这样我就可以避免从我的数据层硬引用我的数据层表示层?
更新
阅读 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 应用程序只需要在服务层上有一个引用。