加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – IoC / DI容器,工厂和运行时类型创建

发布时间:2020-12-15 08:00:09 所属栏目:百科 来源:网络整理
导读:我最近了解了DI框架Guice和Ninject,并希望在我的一些新项目中使用它们. 虽然我熟悉一般依赖注入概念并且知道如何使用这些框架来构建对象图,但在动态应用程序行为方面,我很难应用IoC. 考虑这个例子: 应用程序启动时,将显示主窗口. 当用户单击主面板时,将打开
我最近了解了DI框架Guice和Ninject,并希望在我的一些新项目中使用它们.

虽然我熟悉一般依赖注入概念并且知道如何使用这些框架来构建对象图,但在动态应用程序行为方面,我很难应用IoC.

考虑这个例子:

>应用程序启动时,将显示主窗口.
>当用户单击主面板时,将打开上下文菜单.
>根据用户的选择,将创建一个新的用户控件并显示在鼠标位置.
>如果用户最终决定关闭该应用程序,将显示一个确认框,并在确认后将关闭主窗口.

虽然很容易将主窗口的View连接到Presenter / ViewModel,然后将其绑定到域逻辑,但我不明白如何干净地(在IoC意义上)实现以下任务:

>动态实例化具体的UI控件(例如IGreenBoxView,IRedImageView< -JConcreteGreenBoxView,JConcreteRedImageView),而不使用任何类型的服务定位器模式(例如,再次从IoC请求) >根据具体情况,创建新模型,演示者和视图实例 >类似地,实例化一个新的具体对话框,例如JOptionPane在运行时
我已经看到一些使用抽象工厂的解决方案,但老实说并没有完全理解它们.似乎这样的解决方案会导致将一些(查看域名,presenter域名,……)内部类型暴露给构造根,并由此暴露给整个世界.

那么 – 我该怎么做呢?

解决方法

如果您可以重用控件,那么您可以在使用它们的地方进行构造函数注入.否则你必须注入一个工厂:
public interface IControlFactory 
{
     IGreenBoxView CreateGreenBoxView();
     IRedImageView CreateRedImageView();
}

并将其注入需要创建此控件的位置.

实现转到容器配置.在那里,您可以将容器注入实现.一些容器提供自动实现此工厂.例如,在Ninject:

Bind<IControlFactory>().ToFactory();

见https://github.com/ninject/ninject.extensions.factory/wiki

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读