...
Code Block |
---|
@Action public class Customer_placeOrder { private final Customer target; public Customer_placeOrder(Customer target) { ... } @Value @Accessors(fluent = true) public static class PlaceOrderParameters { ... } // see @Parameter() @MemberOrder(1) below. Product product; @Parameter() @MemberOrder(2) int quantity; } public static class PlaceOrderEvent extends ActionDomainEvent<Customer> {} @Action(domainEvent = PlaceOrderEvent.class) public Customer act(PlaceOrderParameters params) { return params.act(this); } public boolean hideAct(PlaceOrderParameters params) { return params.hide(this); } public String disableAct(PlaceOrderParameters params) { return params.disable(this); } public String disable1Act(PlaceOrderParameters params) { return params.disable1(this); } public Collection<Product> choices0Act(PlaceOrderParameters params) { return params.choices0(this); } public Product default0Act(PlaceOrderParameters params) { return params.default0(this); } public int default1Act(PlaceOrderParameters params) { return params.default1(this); } public String validate1Act(PlaceOrderParameters params) { return params.validate1(this); } public String validateAct(PlaceOrderParameters params) { params.validate(this); } } |
which would then beef up the parameters object:
Code Block |
---|
@Action
public class Customer_placeOrder {
private final Customer target; // target
...
@Value @Accessors(fluent = true)
public static class PlaceOrderParameters {
@Parameter() @MemberOrder(1)
Product product;
@Parameter() @MemberOrder(2)
int quantity;
public Customer act(Customer customer) { ... } // execution
public boolean hideAct(Customer customer) { ... } // supporting methods
public String disableAct(Customer customer) { ... }
public String disable1Act(Customer customer) { ... }
public Collection<Product> choices0Act(Customer customer) { ... }
public Product default0Act(Customer customer) { ... }
public int default1Act(Customer customer) { ... }
public String validate1Act(Customer customer) { ... }
public String validateAct(Customer customer) { ...}
}
...
public static class PlaceOrderEvent extends ActionDomainEvent<Customer> {}
@Action(domainEvent = PlaceOrderEvent.class) // event publishing
public Customer act(PlaceOrderParameters params) { return params.act(this); } // remainder is just boilerplate
public boolean hideAct(PlaceOrderParameters params) { return params.hide(this); }
public String disableAct(PlaceOrderParameters params) { return params.disable(this); }
public String disable1Act(PlaceOrderParameters params) { return params.disable1(this); }
public Collection<Product> choices0Act(PlaceOrderParameters params) { return params.choices0(this); }
public Product default0Act(PlaceOrderParameters params) { return params.default0(this); }
public int default1Act(PlaceOrderParameters params) { return params.default1(this); }
public String validate1Act(PlaceOrderParameters params) { return params.validate1(this); }
public String validateAct(PlaceOrderParameters params) { params.validate(this); }
} |
Notes:
- the target is still outside of the parameters object
- Event publishing also outside
- Everything else has moved inside the parameters object
- This implies that we would need dependency injection for the parameters object
- The rest of the code in the mixin is just boilerplate. It's possible that the Lombok @Delegate annotation might be used to remove some of this boilerplate, didn't investigate further.
Mixins and Parameters combined (proposed)
...