AJ.*_*AJ. 5 entity-framework dependency-injection entity-framework-6 asp.net-core-mvc asp.net-core
我正在使用MVC 6进行一些原型设计并遇到了困境.我们的项目架构非常简单:
数据层(实体框架6)
服务层(类库,引用数据层)
表示层(MVC 4,引用服务层,不引用数据层)
即使在阅读(并同意)Composition Root模式之后,我也试图使设计尽可能与原始设计相似.这意味着我的新MVC 6应用程序不知道我的DbContext类型.您可以猜测当我尝试将一个服务类注入控制器时会发生什么:
Unable to resolve service for type My.Data.Tier.DbContext while attempting to activate My.Service.Tier.SomeService.
我相信我们之前的实现(我没有写它)DbContext通过反映bin文件夹中的程序集来解决.有没有一种方法可以使用Microsoft.Extensions.DependencyInjection内置于ASP.NET 5/MVC 6 的新命名空间来完成这个(或类似的东西)所以我可以避免从我的表示层对我的数据层进行硬引用?
更新
阅读Joe Audette的回答后,我想出了一个非常简单的扩展方法,我将其添加到服务层:
public static class ServiceCollectionExtensions
{
public static void RegisterDbContext(this IServiceCollection services)
{
services.AddScoped<My.Data.Tier.DbContext, My.Data.Tier.DbContext>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的MVC应用程序的Startup.cs中:
using My.Service.Tier.ExtensionNamespace;
public void ConfigureServices(IServiceCollection services)
{
services.RegisterDbContext();
}
Run Code Online (Sandbox Code Playgroud)
我认为在内置DI中,您需要的所有内容都必须在DI服务中注册.
要将数据引用保留在MVC应用程序之外,您可以在服务层中使用IServiceCollection扩展方法来注册dbcontext,或者它可以在数据层上调用扩展方法.
这样你的mvc应用程序只需要在服务层上有一个引用.
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |