27 个版本
0.2.137 | 2019年11月12日 |
---|---|
0.2.136 | 2019年9月26日 |
0.1.99 | 2019年9月10日 |
28 在 #设计模式
63 每月下载次数
在 domain_patterns 中使用
60KB
562 行
domain_derive
此 crate 提供了 domain_patterns
derive 宏。
实体宏
Entity
derive 宏可用于自动实现来自 domain_patterns
crate 的 Entity
特质的全部方法。这仅在某些先决条件满足时有效
- 您正在将其应用于一个结构体。
- 您的结构体有一个类型为
Uuid
的id
字段。 - 您的结构体有一个
version
字段,它是一种整数类型。
#[macro_use]
extern crate domain_derive;
use uuid::Uuid;
#[derive(Entity)]
struct User {
id: Uuid,
version: u64
};
值设置宏
ValueSetup
derive 宏可用于为您的选择值对象设置尽可能多的样板代码。它检查一些先决条件
- 您正在将其应用于一个结构体。
- 您的结构体有一个名为
value
的单个字段,其类型为任何可克隆的类型。
使用此宏后,您仍然需要实现 ValueObject
特质,但您不需要实现 TryFrom
(或为 TryFrom
创建验证错误,这由宏处理),也不需要实现 PartialEq
或 Clone
。
如果需要在其他地方使用验证错误,则创建的验证错误将是您的结构体名称加上 ValidationError。例如,如果您有一个 Email
结构体,则生成的验证错误将称为 EmailValidationError
。
#[macro_use]
extern crate domain_derive;
use domain_patterns::ValueObject;
use regex::Regex;
#[derive(ValueSetup)]
pub struct Email {
pub value: String,
}
impl ValueObject<String> for Email {
fn validate(value: &String) -> bool {
let email_rx = Regex::new(
r"^(?i)[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$"
).unwrap();
email_rx.is_match(value)
}
fn value(&self) -> &String {
return &self.value;
}
}
领域事件宏
DomainEvent
宏应应用于表示领域事件的结构体。只要满足某些先决条件,它将完全实现 DomainEvent
特质的全部方法
- 您正在将其应用于一个结构体。
- 需要有一个类型为
Uuid
的id
字段。 - 任何整数类型都需要有一个版本字段(不允许浮点数)。
- 需要有一个类型为
Uuid
的aggregate_id
字段。 - 需要有一个类型为
i64
的occurred
字段。
#[macro_use]
extern crate domain_derive;
use uuid::Uuid;
use domain_patterns::event::DomainEvent;
#[derive(Serialize, Clone, DomainEvent)]
pub struct FirstNameUpdatedEvent {
pub aggregate_id: Uuid,
pub first_name: String,
pub version: u64,
pub id: Uuid,
pub occurred: i64,
}
领域事件宏
DomainEvents
宏应该应用于包含所有领域事件变体的枚举。这是一个非常薄的包装,宏所做的只是检查结构是否为枚举,然后应用具有无方法的特质。
#[macro_use]
extern crate domain_derive;
use uuid::Uuid;
use domain_patterns::event::{DomainEvent, DomainEvents};
#[derive(Serialize, Clone, DomainEvent)]
pub struct FirstNameUpdatedEvent {
pub aggregate_id: Uuid,
pub first_name: String,
pub version: u64,
pub id: Uuid,
pub occurred: i64,
}
#[derive(Clone, DomainEvents)]
pub enum UserEvents {
FirstNameUpdated(FirstNameUpdatedEvent),
}
许可:MIT
依赖项
~0.4–1MB
~23K SLoC