Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Entirely untested:</p> <pre><code>public class ViewModelBuilderFactory { public IViewModelBuilder GetViewModelBuilder (string docType, IRepository repository) { switch (docType) { case "ProgressNotes": return new ProgressNotesViewModelBuilder(repository); case "Labs": return new LabsViewModelBuilder(repository); default: throw new ArgumentException( string.Format("docType \"{0}\" Invalid", docType); } } } public interface IViewModelBuilder { TreeViewModel GetDocTreeViewModel(); WorkSpace GetWorkSpace(Patient patient); } public class LabsViewModelBuilder : IViewModelBuilder { private IRepository _repository; public LabsViewModelBuilder(IRepository repository) { _repository = repository; } public TreeViewModel GetDocTreeViewModel() { return new TreeViewModel(_repository.GetPatientLabs()); } public Workspace GetWorkspace(Patient patient) { return LabViewModel.NewLabViewModel(patient); } } public class ProgressNotesViewModelBuilder : IViewModelBuilder { private IRepository _repository; public ProgressNotesViewModelBuilder(IRepository repository) { _repository = repository; } public TreeViewModel GetDocTreeViewModel() { return new TreeViewModel(_repository.GetPatientProgressNotes()); } public Workspace GetWorkspace(Patient patient) { return ProgressNoteViewModel.NewProgressNoteViewModel(patient); } } </code></pre> <p>Now your calling code is:</p> <pre><code>ViewModelBuilderFactory factory = new ViewModelBuilderFactory(); IViewModelBuilder modelBuilder = factory.GetViewModelBuilder(docType, repository); this.DocTreeViewModel = modelBuilder.GetDocTreeViewModel(); Workspace workspace = modelBuilder.GetWorkspace(patient); this.Workspaces.Add(workspace); this.SetActiveWorkspace(workspace); </code></pre> <p>[4 edits since first post; keep seeing mistakes]</p> <p>[Further Edit noting that you're using Castle IOC]</p> <p>In your Castle xml configuration, you could add (and I'm working on only a vague knowledge of Castle here)</p> <pre><code>&lt;component id="ProgressNotesViewModelBuilder" type="MyNamespace.ProgressNotesViewModelBuilder, MyAssembly"&gt; &lt;parameters&gt; &lt;!-- reference to repository here --&gt; &lt;/parameters&gt; &lt;/component&gt; &lt;component id="LabsViewModelBuilder" type="MyNamespace.LabsViewModelBuilder, MyAssembly"&gt; &lt;parameters&gt; &lt;!-- reference to repository here --&gt; &lt;/parameters&gt; &lt;/component&gt; </code></pre> <p>Then you don't need the ViewModelBuilderFactory, you can just replace</p> <pre><code>IViewModelBuilder modelBuilder = factory.GetViewModelBuilder(docType, repository); </code></pre> <p>with</p> <pre><code>IViewModelBuilder modelBuilder = (IViewModelBuilder) container.Resolve(docType + "ViewModelBuilder"); </code></pre> <p>Now you don't need your switch statement at all.</p> <p>However, it's worth noting that switches aren't evil, they just smell bad and like all bad smells should be isolated from everything that smells good; that's what the Factory pattern is intended to achieve.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload