2016-04-25 61 views
5

我典型的.NET 4.5X Web應用程序結構至少有3層:一個Web項目(一個.NET Web應用程序),一個域/業務邏輯項目(一個類庫)和一個數據訪問項目(一個類庫)。 Web項目引用業務層,業務層引用數據訪問層。用數據訪問層安排3層的dotnet核心應用程序

我喜歡這種方法,因爲我的web項目沒有對數據訪問項目的引用(它必須先通過域/業務邏輯層)。我的Web項目不應該有任何訪問上下文或存儲庫類。

在3層.net 4.5.X應用程序中,我在web.config中聲明瞭連接字符串,並將DbContext的名稱作爲連接字符串的名稱屬性。

在新DOTNET核心的模式,我看到每一個例子已在Startup.cs配置像這樣的DbContext:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 
    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<MyApplicationContext>("myconnectionstring or reference to it"); 
} 

通過給啓動一個具體的類使用的的DbContext,我必須引用數據訪問項目,其中定義了dbcontext。我寧願只參考中間層,並避免引用DAL。

我的問題是:我應該如何安排我的解決方案結構,以便避免將我的Web項目的引用添加到我的數據訪問項目中?

我可以使用appsettings.json屬性嗎?

我可以以其他方式添加我的實體配置嗎?

有沒有什麼專業我缺少關於網絡核心?

預先感謝您。

+1

此答案可能會有用,它會刪除網絡層中的EF引用http://stackoverflow.com/a/38360204/1544886 –

回答

3

我發現使用EF6和DOTNET核心,我有相當舒適的解決方案。

它不使用EF7的services.AddSqlServer()調用,而是使用EF6配置並將DbContext註冊到啓動時調用的Bootstrap類中。

public static class BootstrapConfig 
{ 
    public static void RegisterApplicationServices(this IServiceCollection services, IConfigurationRoot configuration) 
    { 
     // DbContext 
     services.AddScoped<DbContext>(x => new ApplicationContext(configuration["Data:ApplicationContext:ConnectionString"])); 
    } 
} 

這是從Startup.cs在WebLibrary項目稱爲

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddMvc(); 

    services.RegisterApplicationServices(Configuration); 
} 

enter image description here

WebLibrary是點網核心的Web應用程序(包含控制器,是啓動項目)。

業務邏輯是服務層,是Web應用程序和數據訪問項目之間的中間層。

數據訪問是實際執行查詢時存在dbContext和存儲庫類的地方。

Model項目包含POCO和枚舉,不是智能對象,而是跨應用程序使用的容器。

引導項目引用了業務邏輯和數據訪問項目,以便它可以註冊IOC容器的服務和存儲庫。

查看示例解決方案的github repo一個問題我還是有,具體到我的應用程序是這樣的:

即使Web庫沒有數據訪問項目的引用,我仍然可以從控制器的一個實例化一個ApplicationContext。將這些項目分離出來的整個目的是讓我們無法直接在Web項目中獲取數據庫上下文。我不確定這是否與Core中的新解決方案結構有關,或者如果我包含某些我不知道的內容。

+3

在你的嘗試中做得很好,有時我想知道是否值得所有的努力只是防止上下文滲透到它不應該的層中,一個有信譽的開發團隊可能會得到而不會濫用這個事實,即有權訪問上下文 –

2

我認爲你正在尋找Repository模式。它是您的業務與DAL之間的一個層。

下面是我組織最近的解決方案,以避免UI知道我的DAL。

enter image description here

+0

感謝您的回覆。我非常瞭解存儲庫模式。在上面描述的數據訪問項目中,我創建了我的存儲庫類,這些類由中間(業務邏輯)層的服務類使用。服務類然後被我的web成員(通常是mvc/api控制器)使用。我主要關心的是避免從客戶端/ web項目到數據層的項目引用。 – rictionaryFever

+0

所以,你可以爲你的倉庫創建另一個項目,並讓該項目引用你的數據層。 並讓您的Web項目引用您的新存儲庫項目? –

+0

感謝您的跟進。我可以看到你所建議的項目結構的實用程序,我用.NET 4應用程序實現這個結構沒有問題,但是我的主要問題是理解如何用.NET Core(.NET 5)實現分層。這可能是我完全忽略了這一點。無論結果如何,我都會用我的解決方案更新這個問題。在.NET Core中,您可以在Startup.cs中將您的dbcontext作爲服務添加。我想保留這個dbcontext的Web應用程序項目。 – rictionaryFever