c# – 带有StructureMap的Model-View-Presenter模式中的Presenter注入

前端之家收集整理的这篇文章主要介绍了c# – 带有StructureMap的Model-View-Presenter模式中的Presenter注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经实现了我自己的模型视图演示者模式的副本(在Web客户端软件工厂的静脉中),所以我可以利用我自己的DI框架而不是绑定到WCSF的ObjectBuilder,我遇到了很多问题.我想出了几个方法来做到这一点,但没有一个特别让我开心.我想知道是否有其他人有其他想法.

解决方案#1a

使用HttpModule拦截context.PreRequestHandlerExecute来调用ObjectFactory.BuildUp(HttpContext.Current.Handler)

  1. public partial class _Default : Page,IEmployeeView
  2. {
  3. private EmployeePresenter _presenter;
  4.  
  5. private EmployeePresenter Presenter
  6. {
  7. set
  8. {
  9. _presenter = value;
  10. _presenter.View = this;
  11. }
  12. }
  13. }

解决方案#1b

页面加载中调用buildup而不是使用HttpModule

  1. public partial class _Default : Page,IEmployeeView
  2. {
  3. private EmployeePresenter _presenter;
  4.  
  5. private EmployeePresenter Presenter
  6. {
  7. set
  8. {
  9. _presenter = value;
  10. _presenter.View = this;
  11. }
  12. }
  13.  
  14. protected void Page_Load(object sender,EventArgs e)
  15. {
  16. ObjectFactory.BuildUp(this);
  17. }
  18. }

解决方案#1c

如果需要,通过Property访问presenter允许Getter to BuildUp.

  1. public partial class _Default : Page,IEmployeeView
  2. {
  3. private EmployeePresenter _presenter;
  4.  
  5. public EmployeePresenter Presenter
  6. {
  7. get
  8. {
  9. if (_presenter == null)
  10. {
  11. ObjectFactory.BuildUp(this);
  12. }
  13.  
  14. return _presenter;
  15. }
  16. set
  17. {
  18. _presenter = value;
  19. _presenter.View = this;
  20. }
  21. }
  22. }

解决方案#2

  1. public partial class _Default : Page,IEmployeeView
  2. {
  3. private EmployeePresenter _presenter;
  4.  
  5. private EmployeePresenter Presenter
  6. {
  7. get
  8. {
  9. if (_presenter == null)
  10. {
  11. _presenter = ObjectFactory.GetInstance<EmployeePresenter>();
  12. _presenter.View = this;
  13. }
  14.  
  15. return _presenter;
  16. }
  17. }
  18. }

解决方案#2b

  1. public partial class _Default : Page,IEmployeeView
  2. {
  3. private EmployeePresenter _presenter;
  4.  
  5. private EmployeePresenter Presenter
  6. {
  7. get
  8. {
  9. if (_presenter == null)
  10. {
  11. Presenter = ObjectFactory.GetInstance<EmployeePresenter>();
  12. }
  13.  
  14. return _presenter;
  15. }
  16. set
  17. {
  18. _presenter = value;
  19. _presenter.View = this;
  20. }
  21. }
  22. }

编辑:添加解决方案1c,2b

解决方法

我使用解决方案#1b,并为所有页面创建一个 layer supertype,以便更多地干掉演示者初始化.像这样:

页码

  1. public partial class _Default : AbstractPage,IEmployeeView
  2. {
  3. private EmployeePresenter presenter;
  4.  
  5. private EmployeePresenter Presenter
  6. {
  7. set
  8. {
  9. presenter = value;
  10. presenter.View = this;
  11. }
  12. }
  13. protected override void Do_Load(object sender,EventArgs args)
  14. {
  15. //do "on load" stuff
  16. }
  17.  
  18. }

摘要页码

  1. public abstract class AbstractPage : Page
  2. {
  3. protected void Page_Load(object sender,EventArgs e)
  4. {
  5. ObjectFactory.BuildUp(this);
  6. this.Do_Load(sender,e);
  7. //template method,to enable subclasses to mimic "Page_load" event
  8.  
  9. }
  10. //Default Implementation (do nothing)
  11. protected virtual void Do_Load(object sender,EventArgs e){}
  12. }

使用此解决方案,您只能在一个类中进行演示者初始化(由ObjectFactory创建),如果您以后需要对其进行修改,则可以轻松完成.

编辑:

Do_Load应该是抽象的还是虚拟的?

Template Method最初声明该方法应该是Abstract,以强制子类实现它,遵守超类契约. (参见维基百科“垄断”的例子<“游戏”). 另一方面,在这种特殊情况下,我们不希望强制用户类重新定义我们的方法,但给它机会这样做.如果你声明它是抽象的,许多类将被迫重新定义方法只是为了让它为空(这显然是代码味道).所以我们提供合理的默认值(什么都不做)并使方法成为虚拟的.

猜你在找的C#相关文章