Completely untested:
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); } }
Now your calling 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);
[4 edits from the first post; continue to see errors]
[Next Edit, noting that you are using Castle IOC]
In the configuration of your xml code you can add (and I only work with vague lock knowledge here)
<component id="ProgressNotesViewModelBuilder" type="MyNamespace.ProgressNotesViewModelBuilder, MyAssembly"> <parameters> </parameters> </component> <component id="LabsViewModelBuilder" type="MyNamespace.LabsViewModelBuilder, MyAssembly"> <parameters> </parameters> </component>
Then you do not need ViewModelBuilderFactory, you can just replace
IViewModelBuilder modelBuilder = factory.GetViewModelBuilder(docType, repository);
from
IViewModelBuilder modelBuilder = (IViewModelBuilder) container.Resolve(docType + "ViewModelBuilder");
Now you do not need a switch statement.
However, it is worth noting that the switches are not evil, they just smell bad and, like all unpleasant odors, should be isolated from everything that smells good; this is what the Factory pattern aims for.
pdr
source share