Skip to content

The Command and Query Responsibility Segregation

License

Notifications You must be signed in to change notification settings

space-code/cqrs

Repository files navigation

cqrs: The Command and Query Responsibility Segregation

cqrs

License Swift Compatibility Platform Compatibility CI CodeCov

Description

cqrs is an implementation of the command and query responsibility segregation in Swift.

Usage

  1. ICommand and IQuery contain data for use by an appropriate handler.

Create an instance of a command that conforms to ICommand or a query that conforms to IQuery, respectively:

import CQRS

final class ExampleCommand: ICommand {
  // MARK: Properties
 
  let value: Int
 
  // MARK: Initialization
  
  init(value: Int) {
    self.value = value
  }
}
import CQRS

final class ExampleQuery: IQueue {
    typealias Result = Int

    // MARK: Properties

    let value: Int

    // MARK: Initialization

    init(value: Int) {
        self.value = value
    }
}
  1. A command handler or a query handler contains the execution logic for a command or a query.

Create an instance of a command handler that conforms to ICommandHandler or a query handler that conforms to IQueryHandler, respectively:

import CQRS

final class ExampleCommandHandler: ICommandHandler {
  typealias Command = ExampleCommand

  // MARK: ICommandHandler

  func execute(command: Command) throws {
    // write the execution logic here
  }
}
import CQRS

final class ExampleQueryHandler: IQueryHandler {
    typealias Query = ExampleQuery

    // MARK: IQueryHandler

    func execute(query: Query) throws -> Query.Result {
        // write the execution logic here
    }
}
  1. Register your handler implementation in the container:
import CQRS

let container = DependencyContainer()
container.register { ExampleCommandHandler() }
import CQRS

let container = DependencyContainer()
container.register { ExampleQueryHandler() }
  1. Create an instance of a CommandDispatcher or a QueryDispatcher with the created container, like this:
import CQRS

let commandDispatcher = CommandDispatcher(container: container)
import CQRS

let commandDispatcher = QueryDispatcher(container: container)
  1. Execute your command on commandDispatcher or queryDispatcher:
let command = ExampleCommand()

do {
  try commandDispatcher.execute(command: command)
} catch {
  // Handle an error.
}
let query = ExampleCommand()

do {
  let result = try queryDispatcher.execute(query: query)
} catch {
  // Handle an error.
}

Requirements

  • iOS 16.0+ / macOS 13+ / tvOS 16.0+ / watchOS 9.0+
  • Xcode 14.0
  • Swift 5.7

Installation

Swift Package Manager

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler. It is in early development, but cqrs does support its use on supported platforms.

Once you have your Swift package set up, adding cqrs as a dependency is as easy as adding it to the dependencies value of your Package.swift.

dependencies: [
    .package(url: "https://github.com/space-code/cqrs.git", .upToNextMajor(from: "1.0.1"))
]

Communication

  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

Contributing

Bootstrapping development environment

make bootstrap

Please feel free to help out with this project! If you see something that could be made better or want a new feature, open up an issue or send a Pull Request!

Author

Nikita Vasilev, nv3212@gmail.com

License

cqrs is available under the MIT license. See the LICENSE file for more info.