Tutorial

This tutorial will focus on the mechanics of the tool, assuming you already understand the IDesign Method. Completly abstract terms with no link to a real project will be used

System Design

Anti-Design

Static Aspect

Eliminate the blank canvas and carry out the anti design by dumping everything in your mind into a static aspect

StaticAspect "Anti-design" {
    PersonClient BodyClient EntityClient IndividualClient SubjectClient
    ConceptManager ConcernManager WidgetManager MatterManager
    PhenonmenonManager ContrivanceManager SubjectManager
    SolveEngine DrawEngine BuildEngine AnswerEngine ArrangementEngine ImmitationEngine
    ApparatusAccess ArticleAccess SubstanceAccess CreatureAccess MachineAccess
    AppratusResource ArticleResource SubstanceResource CreatureResource MachineResource
}
_images/staticAspectAntiDesign.svg

First Iteration

Static Aspect

Based upon the volatitlies create your first Iteration

StaticAspect "Iteration 1" {
    PublicClient PartnerClient
    FeedManager PhenonmenonManager AnalyticsManager NotificationManager
    AnswerEngine ArrangementEngine ImmitationEngine
    EntityAccess MaterialAccess
    CreatureResource MachineResource:a  ArticleResource:n
}
_images/staticAspectIteration1.svg

Call Chains

Create multiple call chains to validate the architecture

UseCase "usecase0" {
    PublicClient -> PhenonmenonManager -> ImmitationEngine  -> EntityAccess
    EntityAccess -> CreatureResource
    EntityAccess -> MachineResource
    ImmitationEngine -> MaterialAccess -> ArticleResource
}

UseCase "usecase1" {
    ...
}

...

UseCase "usecaseN" {
    ...
}
_images/usecase0callchain.svg_images/usecase0sequence.svg

Iterate over architecture and call chains

Carry out multiple iterations eliminating smells and making it your best solution within the timebox

StaticAspect {
    PublicClient PartnerClient
    FeedManager PhenonmenonManager AnalyticsManager
    AnswerEngine ImmitationEngine
    EntityAccess MaterialAccess
    CreatureResource MachineResource:a  ArticleResource:n
    PubSubUtility
    CacheUtility
}

UseCase "usecase0" {
    PublicClient -> PhenonmenonManager -> ImmitationEngine -> CacheUtility
    ImmitationEngine -> EntityAccess
    EntityAccess -> MachineResource
    ImmitationEngine -> MaterialAccess -> ArticleResource
    ImmitationEngine -> CacheUtility
    PhenonmenonManager -:q> PubSubUtility
}

UseCase "usecase1" {
    ...
}

...

UseCase "usecaseN" {
    ...
}
_images/iteration3StaticAspect.svg_images/iteration3CallChain.svg_images/iteration3Sequence.svg

Detailed Design

Operation Names

Working on each layer of your design starting with the managers, create operation names within the use cases

UseCase "..."{
    PublicClient - IPhenonmenonManager.Observe() > PhenonmenonManager
    ...
}
_images/ddOperationNamesObserve.svg
UseCase "..."{
    PublicClient - IAnalyticsManager.Summary() > AnalyticsManager
    ...
}
_images/ddOperationNamesSummary.svg
UseCase "..."{
    PublicClient - IAnalyticsManager.Export() > AnalyticsManager
    ...
}
_images/ddOperationNamesExport.svg
UseCase "..."{
    PubSubUtility - INotificationManager.Notify():q > NotificationManager
    ...
}
_images/ddOperationNamesNotify.svg

Move on to the engine layer

UseCase "..."{
    ...
    PhenonmenonManager - IAnswerEngine.Locate() > AnswerEngine
    ...
}
_images/ddOperationNamesObserveLocate.svg
UseCase "..."{
    ...
    AnalyticsManager - IAnswerEngine.Summarize() > AnswerEngine
    ...
}
_images/ddOperationNamesSummarySummarize.svg
UseCase "..."{
    ...
    PhenonmenonManager - IImmitationEngine.Mimic() > ImmitationEngine
    ...
}
_images/ddOperationNamesObserveMimic.svg

Repeating the process for the access layer is left as an exercise for the reader

DTO Names

Working through the layers again we can add DTOs to the detailed design

UseCase "..."{
    PublicClient - ObservationResponse IPhenonmenonManager.Observe(ObservationRequest ) > PhenonmenonManager
    PhenonmenonManager - IImmitationEngine.Mimic() > ImmitationEngine
}
_images/dtoObservationRequestResponse.svg
UseCase "..."{
    PublicClient - ObservationResponse IPhenonmenonManager.Observe(ObservationRequest ) > PhenonmenonManager
    PhenonmenonManager - MimicResponse IImmitationEngine.Mimic(MimicRequest) > ImmitationEngine
}
_images/dtoMimicRequestResponse.svg

Supporting Polymorphism

UseCase "...Linear"{
    PublicClient - ObservationResponse IPhenonmenonManager.Observe(ObserveLinear ) > PhenonmenonManager
    ...
}

UseCase "...Parallel"{
    PublicClient - ObservationResponse IPhenonmenonManager.Observe(ObserveParallel ) > PhenonmenonManager
    ...
}
_images/dtoLinear.svg_images/dtoParallel.svg

Contexts

Extend using contexts for DTOS for calls to the manager

UseCase "...PublicLinear"{
    PublicClient - Public.ObservationResponse IPhenonmenonManager.Observe(Public.ObserveLinear ) > PhenonmenonManager
    ...
}

UseCase "...PartnerLinear"{
    PublicClient - Partner.ObservationResponse IPhenonmenonManager.Observe(Partner.ObserveLinear ) > PhenonmenonManager
    ...
}
_images/dtoPublicLinear.svg_images/dtoPartnerLinear.svg

Extend using contexts for Interfaces

UseCase "...PublicLinear"{
    ...
    PhenonmenonManager - MimicResponse Phenonmenon.IImmitationEngine.Mimic(MimicRequest) > ImmitationEngine
}
_images/contextInterface.svg

Wrapper

Consider using a generic wrapper for Engine responses

UseCase "...PublicLinear"{
     ...
     PhenonmenonManager - Response<MimicResponse> Phenonmenon.IImmitationEngine.Mimic(MimicRequest) > ImmitationEngine
}
_images/responseWrapper.svg

Generate

Select Generate from the options menu and run the script on your local machine.

Generate Solution, Projects and DTOs

Visual studio solution structure

_images/GeneratedDetailedDesignVisualSudio.png

Polymorphic contextual DTOs

_images/GeneratedVisualStudioPolymorphicContextualDtos.png