It is a set of framework to learn, organize and accelerate development of the heart of software.
<repository url="https://github.com/roadtoagility/dflow" />
That is a major refactoring of DFlow to be more "friendly" and have consistent programming model.
- DFlow.Business will be maintained any more
- DFlow.Business.Cqrs will be maintained any more
- DFlow.Domain become DFlow (back to origins :)
- DFlow.Specifications become a separated assembly
- BaseEntity -> EntityBase
- All Events must inherits from DomainEvent abstract class
- There a new interface to raise events, so events can be raised from Entities or via Aggregates as you need.
- DFlow.Domain.Events merged with DFlow and had several APIs changes
Domain Flow aka DFlow is a very light and opnionated set of frameworks to help implement the hearth of applications based on Domain-Driven Design. There are 3 assemblys organized as described bellow:
- DFlow: Core assembly providing objets to implement Entities, ValueObjects, Validations and Aggregates;
- DFlow.Specifications: It is a Specification Design Pattern implementation;
- DFlow.Persistence: This project depends on DFlow because it is responsible to translate from/to domain objects representation. It is a set os interfaces to materialize domain layer to be persisted in any format that you want. The 3 major patterns implemented are Unity Of Work and Repository.
Addon: DFlow.Persistence. DFlow as based on clean architecture principles, so domain layer aka Entities are first class citizen.
- The most basic DFlow business object is the Value Object implementation that allows you follow the principle of non-primitive obsession for the objects you want.
// Value Object
public sealed class Email : ValueOf<string,Email>
{
}
- Defining and Entity
// Entity
public class User : EntityBase<UserId>
{
public User(UserId identity, Email mail, VersionId version)
: base(identity, version)
{
Mail = mail;
AppendValidationResult(identity.ValidationStatus.Failures);
AppendValidationResult(mail.Failures);
}
public Email Mail { get; private set; }
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Identity;
yield return Mail;
}
// DOmain objects can have static contualized api based on factory methods
public static PrimaryEntity From(PrimaryEntityId id, SecondaryEntity secondary, SimpleValueObject simpleObject,
VersionId version)
{
return new PrimaryEntity(id, secondary, simpleObject, version);
}
// Domain Objects can have instance business methods
// Entities can raise events
public void Update(Email mail)
{
if (!mail.ValidationStatus.IsValid)
{
AppendValidationResult(mail.ValidationStatus.Failures);
}
Mail = mail;
RaisedEvent(UserMailUpdatedEvent.For(this));
}
}
- Adriano Ribeiro @drr00t
- Douglas José Ramalho Araujo @dougramalho
- Marco V Gurrola @marcovgurrola
- Zama Bandeira Braga @zamabraga
Supporter | Description |
---|---|
All Products Pack License for Open Source under program Free License Programs |
A special thank you to Jetbrains for donating licenses to the project.
This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.