3層アーキテクチャは3つのメインレイヤーで構成されています
- PLプレゼンテーション層
- BLLビジネスロジックレイヤー
- DALデータアクセス層
各最上層は下の層にのみ質問し、その上に何も表示されません。
彼らがあなたにあなたのBLLをどのように構築するかについて尋ねるとき、あなたは次のようなものを書くことができます:
namespace Company.BLL
{
// let's create an interface so it's easy to create other BLL's if needed
public interface ICompanyBLL
{
public int Save(Order order, UserPermissions user);
}
public class Orders : ICompanyBLL
{
// Dependency Injection so you can use any kind of BLL
// based in a workflow for example
private Company.DAL db;
public Orders(Company.DAL dalObject)
{
this.db = dalObject;
}
// As this is a Business Layer, here is where you check for user rights
// to perform actions before you access the DAL
public int Save(Order order, UserPermissions user)
{
if(user.HasPermissionSaveOrders)
return db.Orders.Save(order);
else
return -1;
}
}
}
私が作成しているプロジェクトの実例として:

PLはすべて公開されているサービスであり、私のDALはデータベースへのすべてのアクセスを処理します。サービスの2つのバージョン、古いASMXと新しいWCFサービスを処理するサービスレイヤーInterface
があります。これらは公開されているので、簡単です。ユーザーが使用するサービスをオンザフライで選択する
public class MainController : Controller
{
public IServiceRepository service;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
...
if (thisUser.currentConnection.ws_version == 6)
// Use old ASMX Web Service
service = new WebServiceRepository6(url, ws_usr, ws_pwd);
else if (thisUser.currentConnection.ws_version == 7)
// Use the brand new WCF Service
service = new WebServiceRepository7(url, ws_usr, ws_pwd);
...
}
}
上記のコードでは、依存性注入を使用して他のレイヤーの知識を分離しています。このレイヤー(これはMVCプロジェクトのコントローラーであるためプレゼンテーションレイヤー)では、サービスの呼び出し方法を気にする必要はなく、ユーザーがServiceA
代わりに使用するServiceB
...知っておく必要があるのは、aを呼び出すとIService.ListAllProjects()
正しい結果が得られるということです。
提案の分割を開始し、サービス接続に問題が発生した場合、それはプレゼンテーション層とは関係がなく、サービス層(私の場合)であり、簡単に修正できservice.dll
、Webサイト全体を公開する代わりに新しいものを簡単に展開できます。また...
また、すべてのプロジェクトで使用するすべてのビジネスオブジェクトを保持するヘルパーもあります。
お役に立てば幸いです。