2011-09-04 26 views
6

モデル、リポジトリ、サービス、コントローラ、ViewModels、およびビューによってレイヤーで区切られたASP.Net MVC 3 Webアプリケーション(EF 4.1) 。エンティティサービスクラスが別のエンティティのサービスまたはそのリポジトリを呼び出す必要があります

私の質問はベストプラクティスの1つです。別のエンティティへのアクセスが必要なエンティティサービスクラスは、そのサービスまたはそのリポジトリを使用する必要があります。たとえば、エンティティAのサービスメソッドが、Aが作成されたときにエンティティBを更新する必要があるとします。 AのサービスクラスはBのリポジトリまたはサービス層を使用すべきですか?どちらも可能ですが、ベストプラクティスは何ですか?個人的には、別のサービスにアクセスするサービスが好きです。そのように、より進化した方法へのアクセスとしてそう言います。

答えて

1

私はこれらの種類の決定のためによく使われる原則と慣行に転用する傾向があります。 DRY(あなた自身を繰り返さないでください)とKISS(Keep It Simple、Stupid)がここに当てはまります。

エンティティBのサービスクラスをバイパスした結果、一部のロジックを繰り返す必要がない限り、エンティティAのサービスクラスから直接エンティティBのリポジトリを呼び出します。

これは微妙な説明ですが、クラスが1つ少ないことを意味します(ServiceClassA> ServiceClassB> RepositoryClassBではなくServiceClassA> RepositoryClassB)ので、より簡単な解決策になります。

HTH

0

あなたが他のサービスからもいくつかのビジネス・ロジックが必要になる場合がありますので、私は、サービスクラス間の呼び出しを好むだろう。しかし、循環依存を避けるように注意してください。私は可能性のある循環依存を避けるのに役立つ依存性注入を使用することをお勧めします。また、サービスクラスのインターフェイスを作成し、クライアントクラスからこのインターフェイスを使用することを検討します(具体的な実装をコンストラクタに渡します)。

次に、あなたのSericesAはなりますServcieAに依存

class ServiceA : IServiceA 
{ 
    public ResultA Method1() { //some logic }; 
    public void Method2() { //some logic }; 
} 

ServiceBを。

class ServiceB: IServiceB 
{ 
    private IServiceA _serviceA; 
    public ServiceB(IServiceA serviceA) 
    { 
     _serviceA = serviceA; 
    } 

    public ResultB Method() 
    { 
     var result = _serviceA.Method1(); 
     // get result from service A and create and return result for service B 
    } 
} 
関連する問題