Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 在用户控件中使用构造函数注入的方法?_Winforms_Visual Studio_Dependency Injection - Fatal编程技术网

Winforms 在用户控件中使用构造函数注入的方法?

Winforms 在用户控件中使用构造函数注入的方法?,winforms,visual-studio,dependency-injection,Winforms,Visual Studio,Dependency Injection,是否有任何方法可以在不破坏设计器的情况下强制或允许用户控件的构造函数所需依赖项?存在哪些变通办法 具有 或者属性注入,但我更喜欢构造函数注入 其他变通方法或解决方案?您可以重载构造函数。设计人员将在设计时要求使用默认构造函数,因此请确保也提供该构造函数 public UserControl1() { InitializeComponent(); } public UserControl1(Foo arg) : this() { // Do

是否有任何方法可以在不破坏设计器的情况下强制或允许用户控件的构造函数所需依赖项?存在哪些变通办法

具有 或者属性注入,但我更喜欢构造函数注入


其他变通方法或解决方案?

您可以重载构造函数。设计人员将在设计时要求使用默认构造函数,因此请确保也提供该构造函数

    public UserControl1() {
        InitializeComponent();
    }
    public UserControl1(Foo arg) : this() {
        // Do something with arg
        //...
    }

当然,客户端代码必须自己创建用户控件。偏好属性,以使用户控件在设计器中保持有用。如果DesignMode为false,并且您对客户端代码使用控件的方式不满意,则在OnLoad()中引发异常。

设计用户控件,使其不使用依赖项

查看Microsoft提供的控件(ASP.NET、Windows窗体、WPF等)。它们都不使用依赖项。相反,您可以将数据分配给它们-通常是通过可写属性的方式

这是一种更好的设计,因为控件的单一职责应该是呈现数据。因此,如果您还将检索或格式化数据的责任交给it部门,那么您就违反了规则


当您设计这样的控件时,默认构造函数就变得自然了。

是的,我知道您可以重载构造函数,这就是我已经包含使用EditorBrowsable.Never的解决方案的原因。我指的是把它放在默认构造函数上。我在找一些更详细、更枯燥、更具防御性的东西——我不知道你在找什么。通过使用正常的控制模式进行防御性编程,而不是试图提出一些让客户端程序员感到困惑的自定义内容。你可以创建一个定制设计师来帮我。谢谢你花时间回答这个问题,我期待着你的书,现在已经很晚了,我想考虑一下。我的直觉反应是,我讨厌微软的设计,因为它使使用不变性或功能性风格变得如此困难。如果可能,我希望在任何时候都保持有效状态。我对在winForms中SRP’out数据、显示、格式化和检索的想法很感兴趣。这是否意味着每个控件有4个以上的类?如果它改变了什么,这是一个非常特定的用户控件,除了在它设计了两次的表单上之外,它不太可能被重用。我不能说最终会有多少类,但重用并不总是最终目标。另一方面,我完全同意你对微软设计的看法。如果你想添加一个日志管理器来记录事件,如控制加载或控制调整大小,该怎么办?如果我不能注入日志管理器,那么我必须在用户控件本身中创建一个“新”的日志管理器。在我看来,调整屏幕大小是一个演示问题,因此它遵循“可靠”原则…@barrypicker是那些事件吗?@barrypicker在这种情况下,为什么需要插入“日志管理器”来订阅这些事件?