Natknęliśmy się na god object
w naszym systemie. System składa się z public service
udostępnionego naszym klientom, middle office service
i back office service
.Refaktoryzacja obiektów Boga w usługach WCF
Przepływ jest następujący: użytkownik zarejestruje jakąś transakcję w public service
, a następnie menedżera z middle office service
kontroli transakcji i zatwierdza lub odmawia transakcji i wreszcie menedżera z back office service
finalizuje transakcję lub maleje.
I'am używając słowa transaction
, ale w rzeczywistości są to różne rodzaje działalności, takie jak CRUD on entity1
, CRUD on entiny2
... Nie tylko CRUD
operacje, ale wiele innych operacji, jak approve/send/decline entity1
, make entity1 parent/child of entity2
etc etc ...
teraz WCF
Umowy serwisowe są po prostu rozdzielone zgodnie z tymi częściami systemu. Więc mamy 3 zamówień na usługi:
PublicService.cs
MiddleOfficeService.cs
BackOfficeService.cs
i ogromną ilość umów eksploatacji w każdy:
public interface IBackOfficeService
{
[OperationContract]
void AddEntity1(Entity1 item);
[OperationContract]
void DeleteEntity1(Entity1 item);
....
[OperationContract]
void SendEntity2(Entity2 item);
....
}
liczba tych umów operacyjnych są już 2000 we wszystkich 3 usług i około 600 za każdego zamówienia na usługi . Nie jest to po prostu przełamanie najlepszych praktyk, to ogromny problem, aby zaktualizować referencje usług, ponieważ trwa to całe wieki. System rośnie każdego dnia i coraz więcej operacji jest dodawanych do tych usług w każdej iteracji.
A teraz stajemy przed dylematem, w jaki sposób możemy podzielić te bogate usługi na logiczne części. Mówi się, że usługa nie powinna zawierać więcej niż 12 ~ 20 operacji. Inni mówią różne rzeczy. Zdaję sobie sprawę, że nie ma złotej zasady, ale chciałbym usłyszeć kilka zaleceń na ten temat.
Na przykład, jeśli po prostu podzielę te usługi na typ jednostki, mogę uzyskać około 50 punktów końcowych usług i 50 odwołań do usług w projektach. Co w tym przypadku dotyczy konserwacji?
Jeszcze jedna rzecz do rozważenia. Załóżmy, że wybieram podejście do podziału tych usług na jednostkę. Na przykład:
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);
}
Teraz to, co się dzieje, że powinienem dodać odniesienie do tej usługi, zarówno w public client
i back office client
. Ale back office
wymaga tylko operacji FinalizeEntity1
i DeclineEntity1
. Oto klasyczne naruszenie Interface segregation principle
w SOLID
. Muszę podzielić to, co dalej, na 3 różne usługi, takie jak IEntity1FrontService
, IEntity1MiddleService
, IEntity1BackService
.
Ile czasu zajmuje ponowne wygenerowanie proxy klienta? – ken2k
@ ken2k, cały proces może trwać 15 minut. W przypadku pierwszych prób 1-2-3 po prostu przestaje działać, a następnie aktualizuje się. Aby uzyskać limit czasu, potrzeba 3-4 minut. Czasami przekracza 2 razy, czasem tylko raz. Czasami 3 razy. Ale to nie jest najważniejsze. Priorytet to refaktoryzacja. Nawet jeśli zajmie to 1 sekundę aktualizacji odniesienia, mimo tego zdecydujemy się na refaktor. –
Mogę dostarczyć rozwiązanie z wciąż tylko 3 usługami, ale 3 interfejsy/implementacje podzielone na wiele interfejsów/implementacji z wykorzystaniem dziedziczenia interfejsu i częściowych implementacji. To jednak nie naprawiłoby czasu regeneracji proxy klienta. – ken2k