mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-10-07 15:46:55 +01:00
Avoid Public Event publisher (#144)
* Avoid Public Event publisher * knowledge(events): scope public-publisher detection to same-app raisers The detection rule flagged every public event publisher, including ones deliberately public so a sibling app can raise them - a contract `internal` cannot express across app boundaries. Scope the finding to publishers that are public although only their own app raises them, and record the cross-app case as a valid Best Practice option. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0b67b90d-e4b4-4b92-9684-726c72c43b3f --------- Co-authored-by: Jesper Schulz-Wedde <jesper.schulzwedde@microsoft.com> Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 0b67b90d-e4b4-4b92-9684-726c72c43b3f
This commit is contained in:
parent
53e2cf2fa4
commit
82422f94c9
7 changed files with 148 additions and 4 deletions
|
|
@ -0,0 +1,43 @@
|
|||
// Demonstration only. Shows the wrong pattern: the publisher carries no access modifier, so it is
|
||||
// public - which never was what lets extensions subscribe.
|
||||
|
||||
codeunit 50100 "Loyalty Points Mgt Bad"
|
||||
{
|
||||
procedure AwardPoints(CustomerNo: Code[20]; SalesAmount: Decimal)
|
||||
var
|
||||
Points: Decimal;
|
||||
IsHandled: Boolean;
|
||||
begin
|
||||
Points := SalesAmount / 10;
|
||||
|
||||
IsHandled := false;
|
||||
OnBeforeAwardPoints(CustomerNo, Points, IsHandled);
|
||||
if IsHandled then
|
||||
exit;
|
||||
|
||||
// ... insert the loyalty entry ...
|
||||
end;
|
||||
|
||||
// BAD: no access modifier, so this publisher is public. Public access does not enable
|
||||
// subscription - it enables raising. Narrowing it to internal after release breaks callers,
|
||||
// so the widening cannot be walked back cheaply.
|
||||
[IntegrationEvent(false, false)]
|
||||
procedure OnBeforeAwardPoints(CustomerNo: Code[20]; var Points: Decimal; var IsHandled: Boolean)
|
||||
begin
|
||||
end;
|
||||
}
|
||||
|
||||
codeunit 50101 "Loyalty Points Caller Bad"
|
||||
{
|
||||
procedure FirePublisherDirectly(CustomerNo: Code[20])
|
||||
var
|
||||
LoyaltyPointsMgt: Codeunit "Loyalty Points Mgt Bad";
|
||||
Points: Decimal;
|
||||
IsHandled: Boolean;
|
||||
begin
|
||||
// Compiles only because the publisher is public. Every subscriber runs although no points
|
||||
// were ever awarded, on a Points value nobody computed, and the IsHandled answer the
|
||||
// subscribers write is read by no one.
|
||||
LoyaltyPointsMgt.OnBeforeAwardPoints(CustomerNo, Points, IsHandled);
|
||||
end;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue