解耦视图、表示和 ASP.NET Web 窗体

2024-02-22

我有一个 ASP.NET Web 窗体页面,演示者需要用控件填充该页面。这种交互对页面生命周期有些敏感,我想知道它是否有一个我不知道的技巧。

我想对整个事情保持实际,但不妥协可测试性。

目前我有这个:

public interface ISomeContract
{
    void InstantiateIn(System.Web.UI.Control container); 
}

该协定依赖于 System.Web.UI.Control,我需要它能够使用 ASP.NET Web Forms 编程模型执行操作。但视图和演示者都可能不了解 ASP.NET 服务器控件。

我该如何解决这个问题?如何在具体视图中使用 ASP.NET Web Forms 编程模型,而不在合同程序集中采用 System.Web.UI.Control 依赖项?

为了澄清一点,这种类型的界面都是关于 UI 组合(使用 MEF)的。它在整个框架中都是已知的,但实际上只是从具体视图中调用。具体的视图仍然是对 ASP.NET Web Forms 唯一了解的东西。然而那些公共方法说InstantiateIn(System.Web.UI.Control)存在于我的合同程序集中,这意味着对 ASP.NET Web 窗体的依赖。

我一直在考虑一些双重调度机制甚至访问者模式来尝试解决这个问题,但我还不知道我想要朝哪个方向发展,我真的很希望对此事有一些意见。


不知道访客会如何解决这个问题。但为什么不让你的合同看起来像这样:

public interface ISomeContract
{
    void InstantiateIn(IControl container); 
}

使用 IControl 实现(可能在另一个程序集中以保持合同程序集干净),它包装了 ASP.NET System.Web.Control,例如:

public class AspnetControl : IControl
{
    public AspnetControl(System.Web.Control control) { }

    // IControl members that dispatch to control
}

尽管最终 IControl 很可能看起来非常像 System.Web.Control(因此一开始就没有抽象它的意义),但它仍然非常易于测试,并且您的视图和演示者获胜无需了解任何有关 ASP.NET 的知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解耦视图、表示和 ASP.NET Web 窗体 的相关文章

随机推荐