システムで a に遭遇しgod objectました。このシステムはpublic service、クライアントに公開されている、middle office serviceおよびで構成されていますback office service。
フローは次のとおりです。ユーザーがトランザクションを に登録しpublic service、マネージャーmiddle office serviceがトランザクションをチェックしてトランザクションを承認または拒否し、最後にマネージャーがトランザクションをback office service確定または拒否します。
という言葉を使っていますが、実際には、transactionのようなさまざまな種類の操作です ... 操作だけでなく、などの他の多くの操作も...CRUD on entity1CRUD on entiny2CRUDapprove/send/decline entity1make entity1 parent/child of entity2
現在、WCFサービス契約はシステムのこれらの部分に従って分離されています。したがって、3 つのサービス契約があります。
PublicService.cs
MiddleOfficeService.cs
BackOfficeService.cs
そして、それぞれの膨大な量の操作契約:
public interface IBackOfficeService
{
[OperationContract]
void AddEntity1(Entity1 item);
[OperationContract]
void DeleteEntity1(Entity1 item);
....
[OperationContract]
void SendEntity2(Entity2 item);
....
}
これらの運用契約数は、3 つのサービス全体ですでに 2000 であり、各サービス契約あたり約 600 です。ベスト プラクティスを破るだけでなく、サービス リファレンスを更新するだけでも時間がかかるため、非常に苦痛です。また、システムは日々成長しており、反復のたびにこれらのサービスにさらに多くの操作が追加されています。
そして今、私たちはこれらの神のサービスを論理的な部分に分割するにはどうすればよいかというジレンマに直面しています. 1 つのサービスには 12 ~ 20 を超える操作を含めるべきではないと言われています。他の人はいくつかの異なることを言います。黄金律がないことは承知していますが、これについていくつかの推奨事項を聞きたいと思います.
たとえば、これらのサービスをエンティティ タイプごとに分割すると、プロジェクトで約 50 のサービス エンドポイントと 50 のサービス参照を取得できます。この場合の保守性についてはどうでしょうか。
考慮すべきことがもう 1 つあります。これらのサービスをエンティティごとに分割するアプローチを選択するとします。例えば:
public interface IEntity1Service
{
[OperationContract]
void AddEntity1(Entity1 item);
[OperationContract]
void ApproveEntity1(Entity1 item);
[OperationContract]
void SendEntity1(Entity1 item);
[OperationContract]
void DeleteEntity1(Entity1 item);
....
[OperationContract]
void FinalizeEntity1(Entity1 item);
[OperationContract]
void DeclineEntity1(Entity1 item);
}
ここで、 と の両方でこのサービスへの参照を追加する必要がpublic clientありback office clientます。しかし、操作back officeのみが必要です。これが in の典型的な違反です。そのため、さらに、、 のような 3 つの異なるサービスに分割する必要があります。FinalizeEntity1DeclineEntity1Interface segregation principleSOLIDIEntity1FrontServiceIEntity1MiddleServiceIEntity1BackService