asp.net 5在多个项目中依赖注入

App*_*ons 7 dependency-injection separation-of-concerns autofac repository-pattern asp.net-core

我有一个ASP.NET 5 dnxcore解决方案,其中包含一些项目来区分我的逻辑:

  • API
  • 核心(具有业务逻辑服务)
  • DAL(存储库接口)
  • 实体框架(存储库实现)

现在我使用DI在我的API控制器的构造函数中调用我的服务:

private readonly IMyService _myService;
public Controller(IMyService myservice){ _myService = myService; }
Run Code Online (Sandbox Code Playgroud)

我核心中的服务也通过构造函数注入获取存储库:

private readonly IMyRepository _myRepo;
public MyService(IMyRepository myRepo){ _myRepo = myRepo; }
Run Code Online (Sandbox Code Playgroud)

目前我需要在我的API的启动类中定义我的DI容器以使其工作.

我的问题是,如何在我的Core-project中将存储库的DI容器的"构建"放入我的服务中.这样,我的API与我的服务使用Entity Framework这一事实松散耦合,因此我可以更改为mongodb,而无需更改我的API项目.

Joe*_*tte 7

您可以轻松地将IServiceCollection的扩展方法添加到服务层,并使用它来注册自己的依赖项.然后在启动时,您只需在服务层上调用该方法,而无需在Web应用程序中引用EntityFramework.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace your.service.layer
{
    public static class MyServiceCollectionExtensions
    {
        public static IServiceCollection AddMyServiceDependencies(this IServiceCollection services)
        {
            services.AddScoped<My.Data.Tier.DbContext, My.Data.Tier.DbContext>();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

启动:

using your.service.layer;

public void ConfigureServices(IServiceCollection services)
{
    services.AddMyServiceDependencies();
}
Run Code Online (Sandbox Code Playgroud)

现在,您的Web应用程序只需要引用您的服务层,并且它不直接依赖于EntityFramework.


Nig*_*888 6

我的问题是,如何在我的Core-project中将存储库的DI容器的"构建"放入我的服务中.这样,我的API与我的服务使用Entity Framework这一事实松散耦合,因此我可以更改为mongodb,而无需更改我的API项目.

你可以,但你不应该这样做.

依赖注入是在整个库中创建松散耦合类的实践,可以将它们插在一起(通常以多种方式).

但是,每个应用程序都应该有一个组合根,这是我们放置耦合代码的应用程序中的一个位置.我们作为开发人员的第一直觉是尝试将耦合代码存储到自己的库中,但这是一种你应该抵制的冲动.请参阅组合根重用.

也就是说,许多DI容器都可以通过使用模块来组织应用程序某些部分的配置.在Autofac中,模块的文档在这里.