asp.netdomain-driven-designaspnetboilerplateapplication-designdddd

What is the purpose of using both Application Service and Manager?


I'm not an experienced programmer. I always browse the source codes to learn some things. ASP.NET Boilerplate is my favorite one. Yesterday, I noticed there is friendship application service (in service/application layer) and friendship manager (in business/domain layer). I didn't understand why there is friendship manager. Friendship service isn't enough?

public interface IFriendshipAppService : IApplicationService
{
    Task<FriendDto> CreateFriendshipRequest(CreateFriendshipRequestInput input);

    Task<FriendDto> CreateFriendshipRequestByUserName(CreateFriendshipRequestByUserNameInput input);

    void BlockUser(BlockUserInput input);

    void UnblockUser(UnblockUserInput input);

    void AcceptFriendshipRequest(AcceptFriendshipRequestInput input);
}
public interface IFriendshipManager : IDomainService
{
    void CreateFriendship(Friendship friendship);

    void UpdateFriendship(Friendship friendship);

    Friendship GetFriendshipOrNull(UserIdentifier user, UserIdentifier probableFriend);

    void BanFriend(UserIdentifier userIdentifier, UserIdentifier probableFriend);

    void AcceptFriendshipRequest(UserIdentifier userIdentifier, UserIdentifier probableFriend);
}

Solution

  • From the documentation on NLayer-Architecture:

    The application layer ... perform[s] requested application functionalities. It uses Data Transfer Objects to get data from and return data to the presentation or distributed service layer. ...

    The domain layer ... perform[s] business/domain logic. ...

    Here's what that means, in high-level comments:

    // IFriendshipManager implementation
    
    public void CreateFriendshipAsync(Friendship friendship)
    {
        // Check if friending self. If yes, then throw exception.
        // ...
    
        // Insert friendship via repository.
        // ...
    }
    
    // IFriendshipAppService implementation
    
    public Task<FriendDto> CreateFriendshipRequest(CreateFriendshipRequestInput input)
    {
        // Check if friendship/chat feature is enabled. If no, then throw exception.
        // ...
    
        // Check if already friends. If yes, then throw exception.
        // ...
    
        // Create friendships via IFriendshipManager.
        // ...
    
        // Send friendship request messages.
        // ...
    
        // Return a mapped FriendDto.
        // ...
    }
    

    Notice that the concerns (and resulting actions) in AppService and Manager are subtly different.

    A Manager is meant to be reused by an AppService, another Manager, or other parts of code.

    For example, IFriendshipManager can be used by:

    On the other hand, an AppService should not be called from another AppService.

    See: Should I be calling an AppService from another AppService?