Is container / kernel entry correct for the main application?

I use Ninject to handle dependencies.

My ApplicationPresenter is responsible for sending user calls to functions throughout the application, therefore, you need to enter several plants at once, thus the container itself. It processes the MDI GUI.

  • Is there a better approach?
  • Can this be done?

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 is responsible for organizing the system functions in the MDI window, for example:

  • User identification
  • Query Management ...

I have AuthenticationPresenter and InquiryManagementPresenter , which are both called from ApplicationPresenter as follows:

User clicks ...

 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(); } } 

And inside InquiriesManagementPresenter , I have dependencies on other presenters like:

  • NewInquiryPresenter
  • EditInquiryPresenter
  • CancelInquiryPresenter
  • ApproveInquiryPresenter ...

Ninject Modules

 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>(); // ... } } 

So, it’s easier for me to skip the Ninject IKernel from presenter to another for those that require several features, such as InquiryManagementPresenter or ApplicationPresenter .

So, is everything all right, or is there an even better way to achieve this?

0
source share
1 answer

You should never go through the DI container, because then you use it as a Service Locator, which is an anti-pattern .

If your ApplicationPresenter requires AuthenticationPresenter and InquiriesManagementPresenter , enter these dependencies:

 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; } } 

If these presenters have their own dependencies, this is completely normal: you simply create the entire graph up , but AplicationPresenter does not need to see any of the subgraphs.

+2
source

All Articles