Tag Archives: download

TrueView V2 Beta, now with POCO support

TrueView V2 has some significant changes since the last version.  You can download the beta and code sample here.

POCO support

TrueView now supports POCO classes, that don’t need to be inherited or marked up with attributes. Now you can re-use your POCO assemblies in other applications, and remove the dependency on the TrueView framework.

To make your POCO classes viewable in the UI, add the following property:

    public Guid ID { get; set; }

To make your classes persistable, add a Version property:

    public long Version { get; set; }

Domain Class enhancements

  • Domain Classes no longer need to be marked with attributes
  • Optional Configuration classes can decouple Domain Objects from the TrueView framework
  • Better support for structs

Infrastructure Class enhancements

  • Infrastructure classes are now decoupled from Domain Classes.
  • IPersistenceInfrastructureService is now exposed, allowing custom Services to be injected at run-time.  TrueView provides FilePersistenceService and NhibernatePersistenceServices out of the box.
  • IExportInfrastructureService replaces the old PrintProvider, and allows you to export data for any Domain Object
  • IPresenterInfrastructureService replaces the old IUiPresenter.  You can control the formatting, and well as providing custom ‘adornments’ to display

UI enhancements

  • Error indicators are now shown next to the property that caused them
  • Custom adornments can be rendered next to an item in the Explorer view
  • Better use of screen estate using multiple columns
  • Improved drag/drop tips now show why certain operations cannot be performed
  • Inline Object and List properties allow users to see more detail without having to drill-down manually.
  • Hyperlinks make it easier to navigate to associated Objects and Lists
  • Additional Enum display options include Slider and Radio-Options.
  • Enum items can be filtered using IQuerySpecification<T>
  • A new Export function replaces the old Print option

Check out the included sample code to learn about the new features.

P.S. There’s a new DomainTypes library available as well.

Domain Types – Interfaces

In the last post, I published the DomainTypes library: a set of .NET interfaces & base classes to provide the building blocks for DDD (source code included).

In this post I’ll describe the interfaces and supporting design decisions.

IDomainObject

Represents any type of object within the Domain model. Currently this is simply used as a marker, signalling to developers that the implementation has DDD semantics.

IEntity

Represents a unique Entity within the system.  The ID property is used to identify the instance during it’s lifetime.  Using a GUID allows identity to be established without having to talk to a persistence store (i.e. database).

IValueObject

Represents a non-unique object within the system.  Note that it’s an object, and not a struct.  Structs may seem like a better semantic fit with DDD, but too many instances can cause memory problems (structs – like value types – are created on the stack).

The Clone() method is used to create copies.  The implementing class can decide whether to create new instances, or use the FlyWeight pattern.

IList<T>

Represents a list of Domain Objects.  It’s crucial that the implementing class raises events before items are added or removed from the list.  This allows consumer code to execute any domain rules, and cancel the action if necessary.

IEvent

This is one that Eric Evans mentioned earlier this year.  It is used to record & identify domain events, and must be immutable. For example, a child’s birth should be captured, be identifiable, but never modified.

IAggregateRoot

Most people understand Aggregate Roots as a cluster of closely associated entities.  However, there are 2 additional concerns that an Aggregate Root has:

  1. It knows how to validate the entire aggregate
  2. It is used to lock it’s contents in a multi-user environment

The IsConsistent() method is a placeholder for all rules/invariants that apply to the aggregate.  The locking concerns are handled by IRepository<T> (see below).

IFactory<T>

Used to create Domain Objects/Entities/Aggregate Roots that are complex to build.  Only use factories when the code within your constructors becomes unweildy.

IRepository<T>

Used as a facade to a persistence store.  Strictly speaking, repositories should only deal with Aggregate Roots – to access other entities you would navigate through the Aggregate.

In addition to the typical Load()/Save()/Delete() methods, I’ve also included Lock() and Unlock() methods.  This is a crucial function in a multi-user system, and should be considered when designing your Aggregates.

IService

Currently this is simply used as a marker.  Only consider using Services if :

  1. Try as you might, you can’t decide on which Domain Object to place your logic
  2. The logic requires the use of several unassociated Domain Objects
  3. You’re communicating with another module/tier/component

The remaining interfaces aren’t DDD specific, but are to aid real-world implementations.  I’ll discuss those in the near future.

Download the source code

Free .NET type library for Domain Driven Design + source code

I’ve observed a lot of newcomers to the DDD scene, and typically there’s lots of talk about Entities, Value Objects, Aggregate Roots, Repositories, Factories, IoC, and various technical concerns.

But I’m seeing a lot missing from the discussions.  Like “What about the locking implications around an Aggregate?” or “Must Value Objects be immutable“, or even “How do entities retrieve data if they can’t access a repository?“.

To that end, I’ve created a set of interfaces and base classes that represent the building blocks of DDD.  The idea is to get developers thinking about key concepts early in the design process, and let Intellisense provide some guidance.

You can download the source code here.  It has a Ms-Pl licence, so you can modify and use the code as you wish.

The DDD related interfaces are:

  • IDomainObject
  • IEntity
  • IAggregateRoot
  • IValueObject
  • IList<T>
  • IFactory<T>
  • IRepository<T>
  • IService<T>
  • ISpecification<T>
  • IQuerySpecification<TRequestor, TResult>

Additional interfaces for orthogonal concerns are:

  • IPersistable
  • IPersistableList<T>
  • IAudit
  • IAggregateLock
  • IAssertion
  • IDependencyAware
  • IDependencyLocator
  • ITrackable

Interfaces

This is still a work-in-progress, so feedback would be greatly appreciated.  In the next couple of posts, I’ll describe the interfaces and classes.

Download the C# project

P.S. The next version of TrueView will be based on these interfaces.  So if you code a domain model using the compiled library, TrueView will auto-generate a completely interactive UI (with the appropriate semantics) directly from your model.