Skip to content

Instantly share code, notes, and snippets.

@Rookian
Created March 22, 2012 12:03
Show Gist options
  • Save Rookian/2157937 to your computer and use it in GitHub Desktop.
Save Rookian/2157937 to your computer and use it in GitHub Desktop.
Abstract Factory / Service Locator
public class MainViewPresenter : Presenter<IMainView>
{
private readonly IArticleRepository _articlesRepository;
private readonly IUnitOfWork _unitOfWork;
private readonly IPresenterFactory _presenterFactory;
public MainViewPresenter(IMainView view, IArticleRepository articlesRepository, IUnitOfWork unitOfWork, IPresenterFactory presenterFactory)
: base(view)
{
_articlesRepository = articlesRepository;
_unitOfWork = unitOfWork;
_presenterFactory = presenterFactory;
View.DetailsClick += View_DetailsClick;
View.CloseClick += View_CloseClick;
View.CreateClick += View_CreateClick;
View.DeleteClick += View_DeleteClick;
_unitOfWork.Begin();
View.BindModel(_articlesRepository.GetAll().Select(x => new ArticleViewModel { Id = x.Id, Name = x.Name }));
}
public override void Dispose()
{
View.CloseClick -= View_CloseClick;
View.DetailsClick -= View_DetailsClick;
}
private void View_DeleteClick(object sender, EventArgs e)
{
var selectedArticle = View.GetSelectedArticle();
var article = _articlesRepository.GetById(selectedArticle.Id);
_articlesRepository.Delete(article);
_unitOfWork.Commit();
}
private void View_CreateClick(object sender, EventArgs e)
{
using (var createPresenter = _presenterFactory.Create<IPresenter<ICreateView>>())
{
ShowDialog(createPresenter.View, View);
}
}
private void View_CloseClick(object sender, EventArgs e)
{
View.Close();
}
private void View_DetailsClick(object sender, EventArgs eventArgs)
{
var article = View.GetSelectedArticle();
if (article == null) return;
using (var detailPresenter = _presenterFactory.Create<IPresenter<IDetailView>>(article))
{
ShowDialog(detailPresenter.View, View);
}
}
}
New with an abstract Factory:
public class MainViewPresenter : Presenter<IMainView>
{
private readonly IArticleRepository _articlesRepository;
private readonly IUnitOfWork _unitOfWork;
readonly IPresenterFactory<IPresenter<ICreateView>> _createPresenterFactory;
readonly IPresenterFactory<IPresenter<IDetailView>> _detailPresenterFactory;
public MainViewPresenter(IMainView view, IArticleRepository articlesRepository, IUnitOfWork unitOfWork,
IPresenterFactory<IPresenter<ICreateView>> createPresenterFactory, IPresenterFactory<IPresenter<IDetailView>> detailPresenterFactory)
: base(view)
{
_articlesRepository = articlesRepository;
_unitOfWork = unitOfWork;
_createPresenterFactory = createPresenterFactory;
_detailPresenterFactory = detailPresenterFactory;
View.DetailsClick += View_DetailsClick;
View.CloseClick += View_CloseClick;
View.CreateClick += View_CreateClick;
View.DeleteClick += View_DeleteClick;
_unitOfWork.Begin();
View.BindModel(_articlesRepository.GetAll().Select(x => new ArticleViewModel { Id = x.Id, Name = x.Name }));
}
public override void Dispose()
{
View.CloseClick -= View_CloseClick;
View.DetailsClick -= View_DetailsClick;
}
private void View_DeleteClick(object sender, EventArgs e)
{
var selectedArticle = View.GetSelectedArticle();
var article = _articlesRepository.GetById(selectedArticle.Id);
_articlesRepository.Delete(article);
_unitOfWork.Commit();
}
private void View_CreateClick(object sender, EventArgs e)
{
using (var createPresenter = _createPresenterFactory.Create())
{
ShowDialog(createPresenter.View, View);
}
}
private void View_CloseClick(object sender, EventArgs e)
{
View.Close();
}
private void View_DetailsClick(object sender, EventArgs eventArgs)
{
var article = View.GetSelectedArticle();
if (article == null) return;
using (var detailPresenter = _detailPresenterFactory.Create(article))
{
ShowDialog(detailPresenter.View, View);
}
}
}
public class PresenterFactory<TPresenter> : IPresenterFactory<TPresenter> where TPresenter : IPresenter<IView>
{
private readonly Func<Type, object, IPresenter<IView>> _getPresenterWithCtorParameter;
private readonly Func<Type, IPresenter<IView>> _getPresenter;
public PresenterFactory(Func<Type, IPresenter<IView>> getPresenter,
Func<Type, object, IPresenter<IView>> getPresenterWithCtorParameter)
{
_getPresenterWithCtorParameter = getPresenterWithCtorParameter;
_getPresenter = getPresenter;
}
public TPresenter Create(object ctorParameter)
{
return (TPresenter) _getPresenterWithCtorParameter(typeof (TPresenter), ctorParameter);
}
public TPresenter Create()
{
return (TPresenter) _getPresenter(typeof(TPresenter));
}
}
@Rookian
Copy link
Author

Rookian commented Mar 26, 2012

I refactored the fine grained presenter factories to a more coarse grained aggregated presenter factory:

public interface IPresenterFactoryForMainViewPresenter
{
    IPresenter<ICreateView> CreateCreatePresenter();
    IPresenter<IDetailView> CreateDetailPresenter(object parameterCtor);
}

public class MainViewPresenter : Presenter<IMainView>
{
    private readonly IArticleRepository _articlesRepository;
    private readonly IUnitOfWork _unitOfWork;
    readonly IPresenterFactoryForMainViewPresenter _presenterFactory;

    public MainViewPresenter(IMainView view, IArticleRepository articlesRepository, IUnitOfWork unitOfWork,
        IPresenterFactoryForMainViewPresenter presenterFactory)
        : base(view, unitOfWork)
    {
        _articlesRepository = articlesRepository;
        _unitOfWork = unitOfWork;
        _presenterFactory = presenterFactory;


        View.DetailsClick += View_DetailsClick;
        View.CloseClick += View_CloseClick;
        View.CreateClick += View_CreateClick;
        View.DeleteClick += View_DeleteClick;
        _unitOfWork.Begin();
        View.BindModel(_articlesRepository.GetAll().Select(x => new ArticleViewModel { Id = x.Id, Name = x.Name }));
    }

    public override void Dispose()
    {
        View.CloseClick -= View_CloseClick;
        View.DetailsClick -= View_DetailsClick;
    }

    private void View_DeleteClick(object sender, EventArgs e)
    {
        var selectedArticle = View.GetSelectedArticle();
        var article = _articlesRepository.GetById(selectedArticle.Id);
        _articlesRepository.Delete(article);
        _unitOfWork.Commit();
    }

    private void View_CreateClick(object sender, EventArgs e)
    {
        using (var createPresenter = _presenterFactory.CreateCreatePresenter())
        {
            ShowDialog(createPresenter.View, View);
        }
    }

    private void View_CloseClick(object sender, EventArgs e)
    {
        View.Close();
    }

    private void View_DetailsClick(object sender, EventArgs eventArgs)
    {
        var article = View.GetSelectedArticle();

        if (article == null) return;

        using (var detailPresenter = _presenterFactory.CreateDetailPresenter(article))
        {
            ShowDialog(detailPresenter.View, View);
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment