2016-04-25 2 views
5

典型的な.NET 4.5X Webアプリケーション構造には、Webプロジェクト(.NET Webアプリケーション)、ドメイン/ビジネスロジックプロジェクト(aクラスライブラリ)、データアクセスプロジェクト(クラスライブラリ)があります。 Webプロジェクトはビジネスレイヤを参照し、ビジネスレイヤはデータアクセスレイヤを参照します。データアクセス層を持つ3層のdotnetコアアプリケーションを整理する

私のWebプロジェクトはデータアクセスプロジェクトへの参照を持っていないので、私はこのアプローチが好きです(ドメイン/ビジネスロジックレイヤーを最初に通過する必要があります)。私のWebプロジェクトは、コンテキストクラスまたはリポジトリクラスにアクセスするべきではありません。

3層のネット4.5.Xアプリでは、web.configに接続文字列を宣言し、DbContextの名前を接続文字列の名前属性として指定します。新しいDOTNETコアパラダイムで

、私が見るすべての例では、DbContextはこのようStartup.csで構成されています:dbcontextに使用するスタートアップに具体的なクラスを与えることによって

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

、私が参照する必要がありますdbcontextが定義されているデータアクセスプロジェクト。中間層のみを参照し、DALへの参照を避けることをお勧めします。

質問:自分のWebプロジェクトからデータアクセスプロジェクトへの参照を追加しないように、私のソリューション構造をどのように整理すればよいですか?

appsettings.jsonプロパティを使用できますか?

エンティティの設定を別の方法で追加できますか?

dot net coreについて私が迷っているメジャーはありますか?

ありがとうございます。

+1

この回答は有用であり、Web層の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"])); 
    } 
} 

これは

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

    services.RegisterApplicationServices(Configuration); 
} 

enter image description here

WebLibraryドットネットコアのWebアプリケーションであるとしてWebLibraryプロジェクトのStartup.csから呼び出された(コントローラを含む、スタートアッププロジェクトです)。

ビジネスロジックはサービスレイヤーで、Webアプリケーションとデータアクセスプロジェクトの中間層です。

データアクセスは、実際にクエリを実行するためのdbContextクラスとリポジトリクラスが存在する場所です。

モデルプロジェクトには、スマートオブジェクトではなく、アプリケーション全体で使用されるコンテナであるPOCOとEnumが保持されます。

ブートストラッププロジェクトには、IOCコンテナのサービスとリポジトリを登録できるように、ビジネスロジックプロジェクトとデータアクセスプロジェクトの両方への参照があります。

サンプル溶液についてはgithub repoをご覧ください。私のアプリケーションに固有の私はまだ持っている 一つの問題は、このです:

ウェブライブラリーは、データ・アクセス・プロジェクトへの参照を持っていないにもかかわらず、私はまだコントローラのいずれかからのApplicationContextをインスタンス化することができます。これらのプロジェクトを分けることの全体的なポイントは、私がWebプロジェクトで直接DBコンテキストを取得することを不可能にすることでした。 Coreの新しいソリューション構造に関連しているのか、私が気づいていないものを含んでいるのかは分かりません。

+3

あなたの試みではうまくいっていますが、時には、コンテクストがレイヤーに漏れるのを防ぐだけの努力があれば、有能な開発者からなる信頼できるチームが、おそらくコンテキスト –

2

私はあなたがRepositoryパターンを探していると思います。それはあなたのビジネスとDALの間の層です。

私のDALについて知っているUIを避けるため、最近の解決策をどのように整理しましたか?

enter image description here

+0

ありがとうございます。私はリポジトリのパターンを十分に認識しています。上記で説明したデータアクセスプロジェクトでは、中間(ビジネスロジック)レイヤでサービスクラスによって消費されるリポジトリクラスを作成します。私の主な関心事は、クライアント/ Webプロジェクトからデータ層へのプロジェクト参照を避けることです。 – rictionaryFever

+0

リポジトリ用に別のプロジェクトを作成し、そのプロジェクトでデータレイヤーを参照できるようにすることができます。 あなたのWebプロジェクトで新しいリポジトリプロジェクトを参照できますか? –

+0

フォローアップしていただきありがとうございます。私はあなたが提案しているプロジェクト構造のユーティリティを見ることができますが、.NET 4アプリケーションでその構造を実装するのに問題はありませんが、主な問題は.NET Core(.NET 5)でレイヤーを実装する方法を理解することです。私は完全にその点を見逃している可能性があります。私がどのような解決策をとっても、私はこの問題を私の解決策で更新します。 .NETコアでは、dbcontextをStartup.csのサービスとして追加できます。私はそのdbcontextをWebアプリケーションプロジェクトから守りたいと思います。 – rictionaryFever

関連する問題