Skip to content

Instantly share code, notes, and snippets.

@thiagomajesk
Last active May 26, 2017 15:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thiagomajesk/bba6f93547d12285f8dae465fadd01bb to your computer and use it in GitHub Desktop.
Save thiagomajesk/bba6f93547d12285f8dae465fadd01bb to your computer and use it in GitHub Desktop.
ViewModelFactory (Mediator Pattern)
public class CharacterController : Controller
{
/*[...]*/
public IActionResult Profile(int id)
{
/*[...]*/
var viewModel = viewFactory.Build<int, CharacterProfileViewModelBuilder>(id);
return View(viewModel);
}
}
public class CharacterProfileViewModelBuilder : IViewModelBuilder<Character, CharacterProfileViewModel>
{
private readonly DatabaseContext context;
private readonly IMapper mapper;
//Dependencies "automatic" discovered by ASP.NET Core container
public CharacterProfileViewModelBuilder(DatabaseContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
public CharacterProfileViewModel Build(Character input)
{
return new CharacterProfileViewModel{Id = input.Id, Name = input.Name};
}
}
public class DefaultViewFactory : IViewModelFactory
{
private readonly IServiceProvider provider;
public DefaultViewFactory(IServiceProvider provider)
{
this.provider = provider;
}
protected IViewModelBuilder<TViewModel> GetViewBuilder<TViewModel>()
{
return provider.GetService(typeof (IViewModelBuilder<TViewModel>)) as IViewModelBuilder<TViewModel>;
}
protected IViewModelBuilder<TInput, TViewModel> GetViewBuilder<TInput, TViewModel>()
{
return provider.GetService(typeof (IViewModelBuilder<TInput, TViewModel>)) as IViewModelBuilder<TInput, TViewModel>;
}
public TViewModel Build<TViewModel>()
{
var builder = GetViewBuilder<TViewModel>();
return (builder != null ? builder.Build() : Activator.CreateInstance<TViewModel>());
}
public TViewModel Build<TInput, TViewModel>(TInput input)
{
var builder = GetViewBuilder<TInput, TViewModel>();
return (builder != null ? builder.Build(input) : Activator.CreateInstance<TViewModel>());
}
}
public interface IViewModelBuilder<TViewModel>
{
TViewModel Build();
}
public interface IViewModelBuilder<TInput, TViewModel>
{
TViewModel Build(TInput input);
}
public interface IViewModelFactory
{
TViewModel Build<TViewModel>();
TViewModel Build<TInput, TViewModel>(TInput input);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment