Sure.

Dan pointed in the previous email to the Estatio web app he and Jeroen are 
developing, as it's fully Apache licensed.

Use it for best practices using Apache Isis. 

There you will find an "app" Maven module different from the "domain" Maven 
module, used for defining Services that use actions and generate View Models 
from Domain Entities defined in the "domain" module.
You should not find any Domain Entity on the  "app" Maven module, as its 
responsibility it's to define a "facade"? for the web UI or the REST API.

All business logic, Domain Entities, etc. should be on the "domain" Maven 
module.

Services in the "app" module should only be attached to the UI (like to define 
menus) or implement actions that are directly invoked from the UI (or REST API) 
that probably a te simply some chained invocations of Actions defined in 
Services, Repositories or Domain Entities from the "domain" Maven module.

There's another example on the Todo web app [1], where you can also see how the 
"todo-app" Maven module uses Domain Entities and other business logic that 
resides in the "todo-domain" Maven module.

HTH,

Oscar


[1] https://github.com/isisaddons/isis-app-todoapp/blob/master/README.md

[2] 
https://github.com/isisaddons/isis-app-todoapp/tree/master/app/src/main/java/todoapp/app



Disculpa que sea breve. 
Enviado desde mi móvil
> El 15 feb 2017, a las 21:13, L Eder <[email protected]> escribió:
> 
> Dan:
> Could not delete it. There are plenty of ramifications, scattered
> among many modules.
> IntelliJ says there are over 1k of them.
> 
> However based on what you said about the DOMAIN nature, i explored
> more, and confirmed there is no problem for it indeed works. I
> perceived ExportToWordMenu as being the one impeding the suppression.
> It was contributing with one menu item there in QuickObjectMenu.
> I then looked at its nature value, and was undefined (maybe using the
> default value). Then i defined it to DOMAIN and the issue was nicely
> fixed.
> 
> Oscar:
> Thanks and sorry i am a newbie here. Could you elaborate a bit more,
> sort of sample code?
> 
> 
> 2017-02-15 14:42 GMT-04:00, Dan Haywood <[email protected]>:
>> Yes, this is actually how Estatio is currently structured [1].  We're not
>> certain if we're going to stick with it, but the original thinking was
>> similar to what you say.
>> 
>> Cheers
>> 
>> [1]
>> https://github.com/estatio/estatio/tree/master/estatioapp/app/src/main/java/org/estatio/app/menus
>> 
>> 
>> On Wed, 15 Feb 2017 at 18:20 Óscar Bou - GOVERTIS <[email protected]>
>> wrote:
>> 
>>> 
>>> You could define the "menu service", and other coordination services
>>> invoking domain actions that could be guided by the use cases / UI, in an
>>> "app" module, different from the "domain" one.
>>> 
>>> My 2cts ...
>>> 
>>> 
>>> 
>>>> El 15 feb 2017, a las 17:17, Dan Haywood <[email protected]>
>>> escribió:
>>>> 
>>>> The pattern we suggest is two domain services, one being a repository
>>>> for
>>>> an entity - ie QuickObjectRepository - and the other a menu - ie
>>>> QuickObjectMenu.  Not every entity will need a menu, and indeed it
>>>> might
>>>> make sense to have menus that provide access to multiple entities, eg a
>>>> "Reference Data" or "Admin" menu.  In other words, the *Menu services
>>>> are
>>>> really just to organize the UI, while the *Repository services do the
>>> real
>>>> work.
>>>> 
>>>> In this case, if you don't need a menu then just delete
>>>> QuickObjectsMenu.
>>>> It doesn't have any behaviour other than delegating to
>>>> QuickObjectRepository.
>>>> 
>>>> You are correct that setting the nature=DOMAIN should suppress it from
>>> the
>>>> UI also; if that isn't the case, then please create a test example
>>>> application demonstrating the problem and push it to github.
>>>> 
>>>> HTH
>>>> Dan
>>>> 
>>>>> On Wed, 15 Feb 2017 at 14:54 L Eder <[email protected]> wrote:
>>>>> 
>>>>> The code. Actually it is the one at quickstart sample:
>>>>> 
>>>>> QuickObjectRepository:
>>>>> "
>>>>> @DomainService(
>>>>>       nature = NatureOfService.DOMAIN,
>>>>>       repositoryFor = QuickObject.class
>>>>> )
>>>>> public class QuickObjectRepository {
>>>>> 
>>>>>   //region > listAll (programmatic)
>>>>> 
>>>>>   @Programmatic
>>>>>   public List<QuickObject> listAll() {
>>>>>       return container.allInstances(QuickObject.class);
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>>   //region > findByName (programmatic)
>>>>> 
>>>>>   @Programmatic
>>>>>   public QuickObject findByName(
>>>>>           final String name
>>>>>   ) {
>>>>>       return container.uniqueMatch(
>>>>>               new QueryDefault<>(
>>>>>                       QuickObject.class,
>>>>>                       "findByName",
>>>>>                       "name", name));
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>>   //region > findByNameContains (programmatic)
>>>>> 
>>>>>   @Programmatic
>>>>>   public List<QuickObject> findByNameContains(
>>>>>           final String name
>>>>>   ) {
>>>>>       return container.allMatches(
>>>>>               new QueryDefault<>(
>>>>>                       QuickObject.class,
>>>>>                       "findByNameContains",
>>>>>                       "name", name));
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>>   //region > create (programmatic)
>>>>> 
>>>>>   @Programmatic
>>>>>   public QuickObject create(final String name) {
>>>>>       final QuickObject obj =
>>>>> container.newTransientInstance(QuickObject.class);
>>>>>       obj.setName(name);
>>>>>       container.persistIfNotAlready(obj);
>>>>>       return obj;
>>>>>   }
>>>>> 
>>>>>   //endregion
>>>>> 
>>>>>   //region > findOrCreate (programmatic)
>>>>> 
>>>>>   @Programmatic
>>>>>   public QuickObject findOrCreate(
>>>>>           final String name
>>>>>   ) {
>>>>>       QuickObject quickObject = findByName(name);
>>>>>       if(quickObject == null) {
>>>>>           quickObject = create(name);
>>>>>       }
>>>>>       return quickObject;
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>> 
>>>>>   //region > injected services
>>>>> 
>>>>>   @javax.inject.Inject
>>>>>   DomainObjectContainer container;
>>>>> 
>>>>>   //endregion
>>>>> }
>>>>> "
>>>>> 
>>>>> QuickObjectMenu:
>>>>> "
>>>>> @DomainService(
>>>>>        nature = NatureOfService.VIEW_MENU_ONLY
>>>>> //      nature = NatureOfService.DOMAIN
>>>>> )
>>>>> @DomainServiceLayout(
>>>>>       menuOrder = "700",
>>>>>       named = "Quick Objects"
>>>>> )
>>>>> public class QuickObjectMenu {
>>>>> 
>>>>>   //region > listAll (action)
>>>>>   @Action(
>>>>>           semantics = SemanticsOf.SAFE
>>>>>   )
>>>>>   @ActionLayout(
>>>>>           bookmarking = BookmarkPolicy.AS_ROOT
>>>>>   )
>>>>>   @MemberOrder(sequence = "1")
>>>>>   public List<QuickObject> listAll() {
>>>>>       return quickObjectRepository.listAll();
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>>   //region > findByName (action)
>>>>>   @Action(
>>>>>           semantics = SemanticsOf.SAFE
>>>>>   )
>>>>>   @ActionLayout(
>>>>>           bookmarking = BookmarkPolicy.AS_ROOT
>>>>>   )
>>>>>   @MemberOrder(sequence = "2")
>>>>>   public List<QuickObject> findByName(
>>>>>           @ParameterLayout(named="Name")
>>>>>           final String name
>>>>>   ) {
>>>>>       return quickObjectRepository.findByNameContains(name);
>>>>>   }
>>>>>   //endregion
>>>>> 
>>>>>   //region > create (action)
>>>>>   public static class CreateDomainEvent extends
>>>>> ActionDomainEvent<QuickObjectMenu> { }
>>>>> 
>>>>>   @Action(
>>>>>           domainEvent = CreateDomainEvent.class
>>>>>   )
>>>>>   @MemberOrder(sequence = "3")
>>>>>   public QuickObject create(
>>>>>           @ParameterLayout(named="Name")
>>>>>           final String name) {
>>>>>       return quickObjectRepository.create(name);
>>>>>   }
>>>>> 
>>>>>   //endregion
>>>>> 
>>>>>   //region > injected services
>>>>> 
>>>>>   @javax.inject.Inject
>>>>>   QuickObjectRepository quickObjectRepository;
>>>>> 
>>>>>   //endregion
>>>>> }
>>>>> "
>>>>> 
>>>>> 
>>>>> 
>>>>> 2017-02-15 10:35 GMT-04:00, Dan Haywood
>>>>> <[email protected]>:
>>>>>> Should be easy ... can you post the code of the domain service that
>>>>>> is
>>>>>> appearing as a menu that you want to suppress ?
>>>>>> 
>>>>>> 
>>>>>>> On Wed, 15 Feb 2017 at 14:23 L Eder <[email protected]> wrote:
>>>>>>> 
>>>>>>> Hi Dan:
>>>>>>> 
>>>>>>> I browsed the documentation for a way to hide a menu object but
>>>>>>> properties and actions. The closest thing found was
>>>>>>> @NotInServiceMenu.
>>>>>>> I tried some combinations, even using the NatureOfService enum, but
>>>>>>> no
>>>>>>> success so far.
>>>>>>> 
>>>>>>> Idea is to omit, eg, prevent QuickObjects entity from being rendered
>>>>>>> in the menu bar.
>>>>>>> 
>>>>>>> Thanks for you suggestion, Eder
>>>>>>> 
>>>>>> 
>>>>> 
>>> 
>>> 
>> 

Reply via email to