5

我正在做一些MVC 6的原型設計,並陷入了一個窘境。我們的項目架構是足夠簡單:有沒有辦法讓ASP.NET 5依賴注入解決沒有參考的DbContext?

數據層(實體框架6)
服務層(類庫,引用數據層)
表示層(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.

我相信,我們以前的實現(我沒有寫它)在反射組件解決了DbContext bin文件夾。有沒有辦法通過內置於ASP.NET 5/MVC 6的新名稱空間Microsoft.Extensions.DependencyInjection來完成此操作(或其他類似操作),這樣可以避免從我的表示層中強制引用我的數據層?

更新
讀喬·奧德特的回答後,我來到了我添加到我的服務層一個非常簡單的擴展方法:

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

就是這樣做的! – davidfowl

回答

7

我認爲在內置DI中,您需要的所有東西都必須在DI服務中註冊。

爲了讓數據引用遠離您的MVC應用程序,您可以在您的服務層中有一個IServiceCollection擴展方法來註冊dbcontext,或者它可以調用數據層上的擴展方法。

這樣你的mvc應用程序只需要在服務層上有一個參考。

+0

本來不錯:) – Reft

相關問題