對於WindowsForms我有我的IoC的東西,一個單獨的項目。我稱之爲CompositionRoot。 CompositionRoot
(啓動項目)的
切入點:
public static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
BootsTrapper.Boot();
using (var mainForm = ObjectFactory.GetInstance<IPresenter<IMainView>>())
{
Application.Run((Form)mainForm.CurrentView);
}
}
}
的BootsTrapper
負責在註冊,是CompositionRoot
的一部分。
MainViewPresenter顯示第一個窗體。 MainViewPresenter可以使用包含抽象演示者工廠的外觀服務IMainViewPresenterFacade
來顯示其他表單。
public class MainViewPresenter : Presenter<IMainView>
{
readonly IArticleRepository _articlesRepository;
readonly IMainViewPresenterFacade _presenterFactory;
readonly IUnitOfWork _unitOfWork;
public MainViewPresenter(IMainView currentView, IArticleRepository articlesRepository, IUnitOfWork unitOfWork,
IMainViewPresenterFacade presenterFactory)
: base(currentView, unitOfWork)
{
_articlesRepository = articlesRepository;
_unitOfWork = unitOfWork;
_presenterFactory = presenterFactory;
Ensure.That(articlesRepository).IsNotNull();
Ensure.That(presenterFactory).IsNotNull();
CurrentView.DetailsClick += View_DetailsClick;
CurrentView.CloseClick += ViewCloseClick;
CurrentView.CreateClick += View_CreateClick;
CurrentView.DeleteClick += View_DeleteClick;
CurrentView.BindModel(_articlesRepository.GetAll().Select(x => new ArticleViewModel { Id = x.ArticleId, Name = x.Description }));
}
public override void Dispose()
{
base.Dispose();
CurrentView.DetailsClick -= View_DetailsClick;
CurrentView.CloseClick -= ViewCloseClick;
CurrentView.CreateClick -= View_CreateClick;
CurrentView.DeleteClick -= View_DeleteClick;
}
void View_DeleteClick(object sender, EventArgs e)
{
var selectedArticle = CurrentView.GetSelectedArticle();
var article = _articlesRepository.GetById(selectedArticle.Id);
_articlesRepository.Delete(article);
_unitOfWork.Commit();
}
void View_CreateClick(object sender, EventArgs e)
{
using (var createPresenter = _presenterFactory.CreateCreatePresenter())
{
ShowDialog(createPresenter.CurrentView, CurrentView);
}
}
void ViewCloseClick(object sender, EventArgs e)
{
CurrentView.Close();
}
void View_DetailsClick(object sender, EventArgs eventArgs)
{
var article = CurrentView.GetSelectedArticle();
if (article == null) return;
using (var detailPresenter = _presenterFactory.CreateDetailPresenter(article))
{
ShowDialog(detailPresenter.CurrentView, CurrentView);
}
}
}
看看我的SimpleMVP項目或在這個問題Dependency Injection and project structure for Console applications並隨時提出進一步的問題:)
如果我是你,我會創建一個框架項目來存儲一個單獨的IoC,有你在那裏引導捆綁代碼。 – 2012-04-15 09:02:55
@jameslewis對於UI項目來說,如何使用UI項目,因爲如果IoC是在UI引用的單獨項目中,那麼IoC項目不能引用UI,那麼UI項目需要DI提供者? – 2012-04-15 09:09:19