[解決済み】リポジトリとサービスレイヤーの違い?
質問
OOPデザインパターンにおいて、リポジトリパターンとサービスレイヤの違いは何ですか?
ASP.NET MVC 3 アプリに取り組んでいて、これらのデザインパターンを理解しようとしているのですが、私の脳みそはまだ理解できていません...!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?
どのように解決するのですか?
リポジトリレイヤーは、データアクセスに対する追加の抽象化レベルを提供します。代わりに
var context = new DatabaseContext();
return CreateObjectQuery<Type>().Where(t => t.ID == param).First();
データベースから単一のアイテムを取得するために、リポジトリインターフェースを使用します。
public interface IRepository<T>
{
IQueryable<T> List();
bool Create(T item);
bool Delete(int id);
T Get(int id);
bool SaveChanges();
}
を呼び出し
Get(id)
. リポジトリ層では、基本的な
CRUD
の操作を行うことができます。
サービス層は、リポジトリを使用するビジネスロジックを公開します。サービスの例としては、以下のようなものがあります。
public interface IUserService
{
User GetByUserName(string userName);
string GetUserNameByEmail(string email);
bool EditBasicUserData(User user);
User GetUserByID(int id);
bool DeleteUser(int id);
IQueryable<User> ListUsers();
bool ChangePassword(string userName, string newPassword);
bool SendPasswordReminder(string userName);
bool RegisterNewUser(RegisterNewUserModel model);
}
一方
List()
メソッドは、すべてのユーザーを返します。
ListUsers()
IUserServiceは、ユーザーがアクセスできるものだけを返すことができます。
ASP.NET MVC + EF + SQL SERVERでは、こんな流れで通信しています。
<ブロッククオートビュー <- コントローラー -> サービス層 -> リポジトリ層 -> EF -> SQL Server
サービス層 -> リポジトリ層 -> EF この部分はモデルに対して操作します。
ビュー <- コントローラー -> サービス層 この部分は、ビューモデルを操作します。
EDITです。
Orders/ByClient/5 のフロー例 (特定のクライアントの注文を見たい)。
public class OrderController
{
private IOrderService _orderService;
public OrderController(IOrderService orderService)
{
_orderService = orderService; // injected by IOC container
}
public ActionResult ByClient(int id)
{
var model = _orderService.GetByClient(id);
return View(model);
}
}
注文サービスに関するインタフェースです。
public interface IOrderService
{
OrdersByClientViewModel GetByClient(int id);
}
このインターフェースは、ビューモデルを返します。
public class OrdersByClientViewModel
{
CientViewModel Client { get; set; } //instead of ClientView, in simple project EF Client class could be used
IEnumerable<OrderViewModel> Orders { get; set; }
}
これはインターフェースの実装です。モデルクラスとリポジトリを使用して、ビューモデルを作成します。
public class OrderService : IOrderService
{
IRepository<Client> _clientRepository;
public OrderService(IRepository<Client> clientRepository)
{
_clientRepository = clientRepository; //injected
}
public OrdersByClientViewModel GetByClient(int id)
{
return _clientRepository.Get(id).Select(c =>
new OrdersByClientViewModel
{
Cient = new ClientViewModel { ...init with values from c...}
Orders = c.Orders.Select(o => new OrderViewModel { ...init with values from o...}
}
);
}
}
関連
-
[解決済み] Could not find a part of the path ... binroslyncsc.exe
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] DAOパターンとRepositoryパターンの違いは何ですか?
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み】Html.PartialとHtml.RenderPartial、Html.ActionとHtml.RenderActionの比較
-
[解決済み】ASP.NET MVC 3 razor ViewStart ファイルで異なるレイアウトを指定するには?
-
[解決済み】ViewResult()とActionResult()の違いについて)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Replace line break characters with <br /> in ASP.NET MVC Razor view
-
[解決済み】ASP.NET MVC 3 コントローラから200 HTTPステータスコードを返す方法
-
[解決済み】cshtmlテンプレートで関数を作成する方法は?
-
[解決済み】MVC4 DataType.Date EditorForがChromeで日付の値を表示しない、Internet Explorerでは問題なし。
-
[解決済み】NULLモデルを持つrenderpartialは、間違った型を渡される
-
[解決済み] [Solved] ASP.NET MVCコントローラメソッドからJSON.NETでシリアライズされたcamelCase JSONを返すにはどうすればよいですか?
-
[解決済み】ViewModelのベストプラクティス
-
[解決済み】Html.ActionLinkを使用して別のコントローラのアクションを呼び出す
-
[解決済み] ASP.NET MVCにおけるロールベースアクセスコントロール(RBAC)とクレームベースアクセスコントロール(CBAC)の比較
-
[解決済み] Entity Frameworkのデータベースを再作成する方法は?