3

私は4か月前にN層Webアプリケーションを構築する方法を学び始めましたが、すべてをどこに配置するかまだ完全には理解していません。私のアーキテクチャは、ScottMillettの著書「ProfessionalASP.NETDesign Patterns」に基づいており、次のとおりです。

  • Project.Controllers
  • Project.Infrastructure
  • Project.Model
  • Project.Repository.NHibernate
  • Project.Services
  • Project.UI.Web.MVC

彼のケーススタディでは、インフラストラクチャプロジェクトで標準のメンバーシッププロバイダーを使用しました。別のWebアプリケーションを作成したい場合は、インフラストラクチャプロジェクトをソリューションに簡単に追加して、メンバーシップをすぐに使用できるようにすることができます。

しかし、NHibernateを使用する独自のカスタムメンバーシッププロバイダーを作成したいと思います。Servicesプロジェクトでそのサービスを作成し、Repository.NHibernateプロジェクトでそのサービスのリポジトリを作成する必要がありますか?または、他のプロジェクトで再利用できるように、インフラストラクチャプロジェクトを引き続き使用し、そこに作成する必要がありますか?

4

2 に答える 2

3

ソリューションを過度に設計しないでください。これらのことには本当の正誤はありません。問題を解決し、機能を提供するために最も簡単なことをしてください。

したがって、大きな問題は、SqlMembershipProviderを使用して同じことを実現できるのに、なぜそれを行うのかということです(もちろん、aspnet_regsqlコマンドで作成されたテーブル構造を変更している場合を除く)。

とにかく質問はさておき、名前空間についてはMicrosoftの規則に従う傾向があります。したがって、あなたの場合、ソリューションにYourCompany.Web.Securityという名前の新しいクラスライブラリを作成し、YourCompany.Web.Security.HibernateMembershipProviderという名前空間にプロバイダークラスを作成します。すべてのリポジトリとサービス、およびその他のジャンクがこのアセンブリに含まれます。

今、あなたが抱えているより大きな問題は、データストアに関する学術的な質問です。私の経験では、IDと「一般的な」プロファイルデータをアプリケーションデータと同じデータベースに配置しない方がよいでしょう。したがって、この新しいアセンブリは、接続しているデータベースインスタンスをチェックし、メンバーシップのニーズをサポートするためにテーブルなどを作成する必要があります(完全なプロバイダーを実装していると仮定します)

ユーザーを管理するために、独自のWeb/Windowsアプリを作成する必要がある場合もあります。

ですから、これらすべてがSqlMembershipProviderにすでに存在する場合、あなたが何をしているのか、本当に疑問に思います。

以上のことをすべて述べた上で、.net4.5の新しいMicrosoftIdentity Foundation(WIF)機能を調査し、Azureを使用してIDデータを管理することについては多くのことが言われています。セットアップはとても簡単です。

于 2013-01-05T19:58:47.060 に答える
2

PeterとModikaには完全に同意しますが、いくつか追加したいと思います。

アプリを設計するときは、それらを別々のプロジェクトに入れる理由を理解し、関心の分離を完全に理解する必要があります。つまり、何を分離しているのか、なぜそれを心配しているのかを知る必要があります。

私はその特定の本を読んだことがないので、著者のアプローチについてコメントはありません。とにかく、作者が物事に名前を付けた方法が「プロの」方法であると信じる前に、アプリケーションだけでなく、.netフレームワーク自体のようなものがどのように構成されているかを考えてください。

特定のプロジェクトでは、データアクセスコード、オブジェクトモデル、UI、ビジネスロジックなど、いくつかの種類のアーティファクトを作成する必要がある場合があります。

いくつかの自然な境界領域があります。たとえば、永続ストレージオプションを交換する必要がある場合や、LINQ、NHibernateなどのアクセス方法を交換する必要がある場合に備えて、データアクセスコードを分離する必要があります。

オブジェクトモデルを他のソリューションで再利用できるようにしたい場合があります。または、WebFormsからMVCへの移動などのUI部分の交換をサポートしたい場合もあります。オブジェクトモデルの使用方法や使用者に応じて、オブジェクトモデルに異なるビジネスロジックを適用する必要がある場合もあります。

とはいえ、すべてのアプリケーションに同じ構造上のニーズがあるわけではありません。たとえば、オブジェクトモデルは、ビジネスロジックがないと完全に無意味になる可能性があります。または、より可能性が高いのは、クラス定義と絶対にマージする必要がある特定のロジックがあり、他のロジックはライブラリの使用方法に固有である可能性があります。前者の場合は、クラス定義とまったく同じプロジェクト/アセンブリにビジネスロジックを配置する強い理由があります。後者の場合は、他のアセンブリに分離して、オブジェクトのインターフェイス定義を実装することをお勧めします。

私の経験では、わからない場合は一緒に保管してください。状況に応じて後で必要なものをリファクタリングすることを目的とした最も簡単なオプションだからです。

早い段階でオーバーエンジニアリングを行うと、プロジェクトの時間/コストが増加し、後で実現することのない潜在的なメリットが認識されます。これが良い決断になることはめったにありません。さらに、将来何が必要になるかわからないという問題もあります。今すぐ分離すると、今日のプロジェクト時間が長くなり後でリファクタリングする必要があります。これは二重の問題です。真にプロの開発者であるIMHOは、潜在的なソリューションを評価する際に、コスト/開発時間を考慮に入れています。


ここで、他のプロジェクトで再利用される可能性が高いカスタムビルドのメンバーシッププロバイダーに関する特定の要件に到達します。カスタムプロバイダーは、独自のプロジェクトと名前空間に含まれている必要があります。おそらく、のような名前空間を使用しますCompany.Security。これにより、移植性の最良の方法が提供され、この1つのプロジェクトに固有の他のあらゆる種類のものに沿ってドラッグすることなく、関連するコードだけを再利用できます。

プロバイダーモデルを使用しているため、これを直接参照する必要のあるコードを他のプロジェクトに含めることはできません。すでに存在するインターフェースを使用するだけです。

于 2013-01-05T20:20:57.963 に答える