我们在系统中遇到了一个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 个。这不仅破坏了最佳实践,而且由于需要很长时间才更新服务引用是一个巨大的痛苦。并且系统每天都在增长,并且在每次迭代中向这些服务添加越来越多的操作。
而现在我们面临着两难境地,我们如何将这些上帝服务拆分成逻辑部分。有人说一个服务不应该包含超过 12~20 个操作。其他人说一些不同的话。我意识到没有黄金法则,但我只是希望听到一些关于此的建议。
例如,如果我只是按实体类型拆分这些服务,那么我可以在项目中获得大约 50 个服务端点和 50 个服务引用。在这种情况下,可维护性如何?
还有一件事要考虑。假设我选择将这些服务拆分为每个实体的方法。例如:
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
只需要FinalizeEntity1
和DeclineEntity1
操作。Interface segregation principle
所以这是一个经典的in违反SOLID
。因此,我必须将其进一步拆分为 3 个不同的服务,例如IEntity1FrontService
, IEntity1MiddleService
, IEntity1BackService
.