我正在使用Ninject来处理我的依赖项。
我的ApplicationPresenter负责在整个应用程序中向特性分派用户调用,因此需要同时注入多个工厂,因此容器本身也需要注入。它处理MDI GUI。
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窗口中的系统特性,如:
我有一个AuthenticationPresenter和一个InquiryManagementPresenter,它们都将从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中,我依赖于其他演示程序,如下所示:
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>();
// ...
}
}因此,对于那些需要多个功能(如IKernel或ApplicationPresenter )的演示者,我发现将Ninject的ApplicationPresenter从一个演示者传递到另一个更简单。
那么,这还好吗,还是还有更好的方法来实现这一点呢?
发布于 2014-03-31 10:31:45
您不应该到处传递DI容器,因为这样您就可以将它作为一个服务定位器,这是一个反模式。使用。
如果您的ApplicationPresenter需要一个AuthenticationPresenter和一个InquiriesManagementPresenter,那么注入这些依赖项:
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;
}
}如果这些演示者有他们自己的依赖关系,这是完全可以的:您只是在前面建立整个图,但是AplicationPresenter不需要看到任何子图。
https://stackoverflow.com/questions/22753750
复制相似问题