Skip to content

1.1 Business process

Marjan Nikolovski edited this page Apr 9, 2021 · 1 revision

Purpose

All business logic is placed in a single layered unit called a business process. The business process represents a logical unit that handles a single business requirement that can be easily reused throught our application.

The business process contains 3 layers:

  • Auth
  • Validate
  • Handle

How to use

public class MyBusinessProcess : BusinessProcess<int, int, int, VoidResult>
{
    /// <summary>
    /// Auth process
    /// </summary>
    /// <param name="input1"></param>
    /// <param name="input2"></param>
    /// <param name="input3"></param>
    /// <returns></returns>
    public override VoidResult Auth(int input1, int input2, int input3)
    {
        return Ok();
    }

    /// <summary>
    /// Validate process
    /// </summary>
    /// <param name="input1"></param>
    /// <param name="input2"></param>
    /// <param name="input3"></param>
    /// <returns></returns>
    public override VoidResult Validate(int input1, int input2, int input3)
    {
        return BeginValidation()
            .Validate(new MySpecification1(), input1);
            .Validate(new MySpecification2(), input2);
            .Validate(new MySpecification3(), input3)
            .ReturnResult();
    }

    /// <summary>
    /// Handle process
    /// </summary>
    /// <param name="input1"></param>
    /// <param name="input2"></param>
    /// <param name="input3"></param>
    /// <returns></returns>
    public override VoidResult Handle(int input1, int input2, int input3)
    {
        return Ok();
    }
}

Configuration

  • 0 to 3 in generic arguments
  • VoidResult, MethodResult or ListResult out generic argument
  • SignalsAuthorizeProcess and Critical attributes
  • Validation with specification pattern

Examples

public class RegisterUser : BusinessProcess<User, MethodResult<int>>
{
    [Import] private IUserRepository UserRepository { get; set; }

    /// <summary>
    /// Auth process
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    public override MethodResult<int> Auth(User user)
    {
        return Ok();
    }

    /// <summary>
    /// Validate process
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    public override MethodResult<int> Validate(User user)
    {
        return BeginValidation()
            .Validate(new UserHasUsernameAndPassword(), user)
            .ReturnResult();
    }

    /// <summary>
    /// Handle process
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    public override MethodResult<int> Handle(User user)
    {
        var userId = UserRepository.Register(user);
        return userId;
    }
}
Clone this wiki locally