首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将容器/内核注入主应用程序演示程序?

是否可以将容器/内核注入主应用程序演示程序?
EN

Stack Overflow用户
提问于 2014-03-31 04:39:59
回答 1查看 299关注 0票数 0

我正在使用Ninject来处理我的依赖项。

我的ApplicationPresenter负责在整个应用程序中向特性分派用户调用,因此需要同时注入多个工厂,因此容器本身也需要注入。它处理MDI GUI。

  1. 有没有更好的方法?
  2. 这样做可以吗?

ApplicationPresenter

代码语言:javascript
复制
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. 管理询问..。

我有一个AuthenticationPresenter和一个InquiryManagementPresenter,它们都将从ApplicationPresenter中调用,如下所示:

用户点击..。

代码语言:javascript
复制
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模块

代码语言:javascript
复制
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>();
        // ...
    }
}

因此,对于那些需要多个功能(如IKernelApplicationPresenter )的演示者,我发现将Ninject的ApplicationPresenter从一个演示者传递到另一个更简单。

那么,这还好吗,还是还有更好的方法来实现这一点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-31 10:31:45

您不应该到处传递DI容器,因为这样您就可以将它作为一个服务定位器,这是一个反模式。使用。

如果您的ApplicationPresenter需要一个AuthenticationPresenter和一个InquiriesManagementPresenter,那么注入这些依赖项:

代码语言:javascript
复制
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不需要看到任何子图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22753750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档