2014-03-31 19 views
0

我正在使用Ninject來處理我的依賴關係。將容器/內核注入主應用程序演示者是否正確?

我的ApplicationPresenter負責在整個應用程序中調用用戶調用功能,因此需要一次注入多個工廠,因此需要注入容器本身。它處理一個MDI GUI。

  1. 有沒有更好的方法?
  2. 它可以嗎?

ApplicationPresenter

public class ApplicationPresenter 
    : Presenter<IApplicationView> 
    , IApplicationPresenter { 
    public ApplicationPresenter(IApplicationView view, IKernel dependencies) 
     : base(view) { 
     Dependencies = dependencies; 
     View.Connect += OnConnect; 
     View.ManageInquiries += OnManageInquiries; 
    } 

    private static readonly IKernel Dependencies; 
} 

ApplicationPresenter負責在MDI窗口編排系統的功能,如:

  1. 用戶認證
  2. 管理諮詢...

我有一個AuthenticationPresenterInquiryManagementPresenter這兩個都要從ApplicationPresenter稱爲像這樣:

用戶點擊...

public class ApplicationPresenter : ... { 
    // See ctor for event subscription... 

    private void OnConnect() { 
     AuthenticationPresenter authentication = 
      Dependencies.Get<IAuthenticationPresenter>(); 
     authentication.ShowView(); 
    } 

    private void OnManageInquiries() { 
     InquiriesManagementPresenter inquiriesManagement = 
      Dependencies.Get<IInquiriesManagementPresenter>(); 
     inquiriesManagement.ShowView(); 
    } 
} 

而且InquiriesManagementPresenter內,我對其他的依賴主持人:

  • NewInquiryPresenter
  • EditInquiryPresenter
  • CancelInquiryPresenter
  • ApproveInquiryPresenter ...

Ninject模塊

public class ApplicationModule : NinjectModule { 
    public void Load() { 
     Bind<IApplicationPresenter>().To<ApplicationPresenter>().InSingletonScope(); 
     Bind<IApplicationView>().To<ApplicationForm>(); 
    } 
} 

public class AuthenticationModule : NinjectModule { 
    public void Load() { 
     Bind<IMembershipService>().To<MembershipService>(); 
     Bind<IAuthenticationPresenter>().To<AuthenticationPresenter>().InSingletonScope(); 
     Bind<IAuthenticationView>().To<AuthenticationForm>(); 
     Bind<ICredentials>().To<Credentials>().InSingletonScope(); 
     Bind<IUser>().To<User>().InSingletonScope(); 
     Bind<IDatabaseInstance>().To<DatabaseInstance>().InSingletonScope(); 
     Bind<IDatabaseUser>().To<DatabaseUser>().InSingletonScope(); 
    } 
} 

public class InquiryManagementModule : NinjectModule { 
    public void Load() { 
     Bind<INewInquiryPresenter>().To<NewInquiryPresenter>().InSingletonScope(); 
     Bind<INewInquiryView>().To<NewInquiryForm>(); 
     Bind<IEditInquiryPresenter>().To<EditInquiryPresenter>().InSingletonScope(); 
     Bind<IEditInquiryView>().To<EditInquiryForm>(); 
     Bind<IInquiryRepository>().To<InquiryRepository>(); 
     // ... 
    } 
} 

所以,我覺得很簡單的傳遞Ninject的IKernel從演示到另一個用於那些需要多個功能,如InquiryManagementPresenterApplicationPresenter

那麼,這是好的還是有另一種更好的方法來實現這一目標?

+0

儘管可能重複地址的問題存在相同的問題,但上下文有很大的不同,因爲我沒有循環遍歷整個案例,而只使用了MDI應用程序。如果至少我能理解如何將其「翻譯」到我的上下文中,我將同意依靠提供給問題的答案。 –

+0

@MarkSeemann,感謝您指出這個問題。在我的搜索旁邊,我沒有發現這個問題。另外,它只需要TestParser通過TestParser構造函數來獲取兩個參數。其實,那已經是我所做的了。雖然我已經閱讀了這個問題及其所有答案,但我的問題仍然存在,有什麼更好的方法?我是否自己創建一個容器來包裝Ninject IKernel,或者直接傳遞IKernel,否則呢?......老實說,我在這裏有點困惑。我只需要一個踢開始,請。 –

+0

我試圖回答一個正確的答案,然後:) –

回答

2

你不應該通過DI容器,因爲那樣你就可以使用它作爲Service Locator, which is an anti-pattern

如果您ApplicationPresenter需要AuthenticationPresenterInquiriesManagementPresenter,然後注入那些依賴關係:

public class ApplicationPresenter : Presenter<IApplicationView>, IApplicationPresenter 
{ 
    private readonly static AuthenticationPresenter authenticationPresenter; 
    private readonly static InquiriesManagementPresenter inquiriesManagementPresenter; 

    public ApplicationPresenter(
     IApplicationView view, 
     AuthenticationPresenter authenticationPresenter, 
     InquiriesManagementPresenter inquiriesManagementPresenter) 
     : base(view) 
    { 
     this.authenticationPresenter = authenticationPresenter; 
     this.inquiriesManagementPresenter = inquiriesManagementPresenter; 
     View.Connect += OnConnect; 
     View.ManageInquiries += OnManageInquiries; 
    } 
} 

如果這些主持人有自己的依賴,這是完全正常:你剛纔build up the entire graph up front,但AplicationPresenter沒有按」不得不看到任何子圖。

+0

謝謝馬克,我很欣賞它。總而言之,這意味着我不必擔心依賴於「InquiriesManagementPresenter」的主持人?我的意思是,這個主持人依賴於它的觀點,以及三到四個其他主持人,即NewInquiryPresenter,EditInquiryPresenter,DeactivateInquiryPresenter,ApproveRejectInquiryReportsPresenter和CancelInquiryPresenter。我已經閱讀過有關適合我的「外觀」,我猜,我不喜歡它是靜態類的事實,因爲當你訪問它時,它會出現無處不在!它沒有被注入。 –

+0

+1(我知道你並沒有等待它,我很感謝你的回答)另外,我想'Façade'模式可以證明對我的MDI有用,例如,我的'ApplicationPresenter '。 –

+0

我也想過一個工廠的工廠或類似的東西,以便我可以讓我的主持人工廠一起工作。但是它也很糟糕,因爲在測試應用程序時,這將花費很多時間進行測試。 –

相關問題