システムで a に遭遇しgod object
ました。このシステムはpublic service
、クライアントに公開されている、middle office service
およびで構成されていますback office service
。
フローは次のとおりです。ユーザーがトランザクションを に登録しpublic service
、マネージャーmiddle office service
がトランザクションをチェックしてトランザクションを承認または拒否し、最後にマネージャーがトランザクションをback office service
確定または拒否します。
という言葉を使っていますが、実際には、transaction
のようなさまざまな種類の操作です ... 操作だけでなく、などの他の多くの操作も...CRUD on entity1
CRUD on entiny2
CRUD
approve/send/decline entity1
make 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 つの異なるサービスに分割する必要があります。FinalizeEntity1
DeclineEntity1
Interface segregation principle
SOLID
IEntity1FrontService
IEntity1MiddleService
IEntity1BackService