7

我有一些項目的ASP.NET 5 dnxcore液分離我的邏輯:asp.net 5依賴注入在多個項目中

  • API
  • 核心(與業務邏輯服務)
  • DAL(庫接口)
  • 實體框架(該庫實現)

現在我用DI打電話給我服務的常量我的API控制器ructors:

private readonly IMyService _myService; 
public Controller(IMyService myservice){ _myService = myService; } 

的服務,我的核心獲得直通構造函數注入太多的資源庫:

private readonly IMyRepository _myRepo; 
public MyService(IMyRepository myRepo){ _myRepo = myRepo; } 

目前我需要定義我的DI容器在啓動類我的API,使這行得通。

我的問題是,我如何將我的服務中的存儲庫的DI容器的'構建'放在我的Core-project中。這樣,我的API與我的服務使用實體框架的事實鬆散耦合,所以我可以在不更改API項目的情況下更改爲例如mongodb。

回答

6

我的問題是,如何將我的服務中的存儲庫的DI容器的「構建」置於我的Core-project中。這樣,我的API與我的服務使用實體框架的事實鬆散耦合,所以我可以在不更改API項目的情況下更改爲例如mongodb。

你可以,但你不應該做到這一點。

依賴注入(Dependency Injection)是在整個可以插在一起的庫中(通常以多種方式)製作鬆散耦合的類的做法。

但是,每個應用程序應該有一個composition root,這是應用程序中的一個地方,我們把耦合到代碼。我們作爲開發人員的第一本能是嘗試將耦合代碼放入自己的庫中,但這是一種你應該抵制的衝動。請參閱composition root reuse

也就是說,許多DI容器有辦法通過使用模塊來組織應用程序的某些部分的配置。在Autofac中,文檔爲modules is here

+0

你有任何新的aspnet 5依賴注入的例子嗎?謝謝。 –

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>(); 
     } 
    } 

} 

啓動:

using your.service.layer; 

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

現在你的web應用程序只需要你的服務層中的參考,這是不直接依賴於的EntityFramework。

+0

這是最佳做法嗎? –

+0

請參閱[我最近問的問題](http://stackoverflow.com/questions/42428571/transitive-references-in-net-core-1-1)。使用這種方法,您最終會遇到與以前相同的問題:您的Web項目將引用your.service.layer,並且由於_service.layer將通過_transitivity_引用特定的實現,您的Web項目將引用your.service.layer。 – Franco

+0

是的,會有傳遞依賴。我自己把大部分代碼放在類庫項目中,所以對我來說,主要的Web應用程序/控制檯應用程序只是用於連接依賴和配置的組合根。我不認爲這是一個問題。 –

0

See this question,我有同樣的問題,因爲我的應用程序是數據庫不可知的,並基於請求將需要在面向文檔的數據庫(noSQL)和跨數據庫(SQL)之間切換。

0

正如NightOwl888所說,您應該在您的應用程序中有一個CompositionRoot,這是您設置所有依賴關係的地方。 我所做的是: 1.創建一個名爲CompositionRoot的核心類庫。 2.添加一個類來處理你的依賴:

public class DependencyMapper 
{ 
    public static void SetDependencies(IServiceCollection serviceCollection, IConfigurationRoot configuration) 
    { 
     serviceCollection.AddEntityFramework() 
         .AddDbContext<SonoPeopleContext>(options => 
                 options.UseSqlServer(configuration["Data:DefaultConnection:ConnectionString"]) 
                 );    

     MapperConfiguration mapperConfiguration = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new AutoMapperProfileConfiguration()); 
     }); 
     serviceCollection.AddSingleton<IMapper>(sp => mapperConfiguration.CreateMapper()); 

     serviceCollection.AddScoped<IUserService, UserService>(); 

    } 
} 

然後您引用您的CompositionRoot在你的MVC項目,並在你的Startup.cs你只是做

DependencyMapper.SetDependencies(services, Configuration); 

這就是全部。