2016-04-19 2 views
2

私はプロジェクトの構築方法を掘り下げているので、私はOnion Architectureを見つけました。私が理解している限り、それはデータベース駆動型ではなく、ドメイン中心のアーキテクチャです。オニオンアーキテクチャでリポジトリの代わりにサービスを公開するのはなぜですか?

私は苦労の理解を抱えている私は勉強とアーキテクチャについての詳細を学ぶためにいくつかのgithubのプロジェクトを探していますので、私はこの1つhttps://github.com/chetanvihite/OnionArchitecture.Sample

が見つかりました:

彼が使用してどのように
namespace Domain.Interfaces 
{ 
    public interface IUserRepository 
    { 
     IEnumerable<User> GetUsers(); 
    } 
} 

namespace Services.Interfaces 
{ 
    public interface IUserService 
    { 
     IEnumerable<User> GetUsers(); 
    } 
} 

namespace Services 
{ 
    public class UserService : IUserService 
    { 
     private readonly IUserRepository _repository; 

     public UserService(IUserRepository repository) 
     { 
      _repository = repository; 
     } 

     public IEnumerable<User> GetUsers() 
     { 
      return _repository.GetUsers(); 
     } 
    } 
} 

それはコンストラクタインジェクションによるものです。

private readonly IUserService _service; 

public HomeController(IUserService service) 
{ 
    _service = service; 
} 
  1. あなたはいつもそれを消費アプリに、このようなIUserServiceとしてサービスを公開するのですか?しかし、私は気づいた、IUserRepositoryは、IUserServiceと同じ方法がありますか?

  2. インフラストラクチャに関する懸念がある場合は、それは意味ですか、それともデータベースに関係していますか?そうじゃない?そうでない場合は、インフラストラクチャに関する懸念の例は何ですか?

  3. 玉ねぎのアーキテクチャについてもっと学び、学ぶためにダウンロードできるフリープロジェクト/ githubプロジェクトに関するお勧めはありますか?私は例をよく理解しています。

P.S. 私はタマネギのアーキテクチャを学んでいるので、必ずしもそうでなくても、少なくともDDDについて言及しています。だから私は推測する、私はまた、DDDを学習することがあります:)サービス対

+2

いくつかのコードとDDDにおけるサービスの種類については非常に良い記事、:http://gorodinski.com/blog/2012/04/14/services-in -domain-driven-design-ddd/ – guillaume31

答えて

6

1.リポジトリ:あなたはdifference between repositories and servicesに答えを読むことをお勧めします

、および/またはMartin Fowlers service layer定義を。要約すると、リポジトリはデータの永続性を処理しますが、サービスはビジネスロジックのためのクライアント向けAPIを提供します。

与えられた小さな例では、利点は明確ではないかもしれませんが、lockUser(User user)またはjoinGroup(User user, Group group)のような追加の方法があると想像してください(UserService)。 UserServiceは、のいずれかのIUserRepository実装を使用して、実際にビジネスロジックを永続化します。

2.インフラストラクチャは、インフラストラクチャ層は、通常、ファイル・システム、データベースやWebサービスなどへの外部リソースを、語って

懸念します。あなたの例では、IUserRepositoryはインフラストラクチャ層の一部です。私はちょうど発見した

3例

(*でマーク)私が知っている例の収集といくつか:

+0

参考までにありがとうございます。本当にそれを感謝しますが、それは私がリポジトリのlockUserとjoinGroupのような同じメソッドを作成しなければならないということを意味しません。 –

+0

はい、 'IUserRepository'は、ユーザオブジェクトに対して簡単なCRUDメソッドを提供するとします。 'UserService.lockUser(userToLock)'メソッドは、ユーザオブジェクトの状態を(例えば 'userToLock.lock()'によって)変更し、リポジトリを使用して(例えば '_repository.save(userToLock)'によって)保持します。カプセル化によって、UserServiceへの実際の永続化の実装に関係なく、クロスカッティングの問題を簡単に追加できます(たとえば、アクセス制御、イベントの起動、ログなど)。 –

関連する問題