Created
March 22, 2012 12:03
-
-
Save Rookian/2157937 to your computer and use it in GitHub Desktop.
Abstract Factory / Service Locator
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I refactored the fine grained presenter factories to a more coarse grained aggregated presenter factory: