建议用户控件之间的松散耦合

时间:2014-04-18 22:14:53

标签: c# asp.net

我在页面上有5个用户控件,每个控件都实现了它自己的包含属性和事件的接口。为了实现用户控件之间的通信,我在其他用户控件中创建了目标用户控件的属性。通过此属性,可以更改其状态并能够注册其事件。

以下是结果用户控制的伪代码。它订阅了搜索用户控件的OnSearch事件。

public interface IResults
{
     //other fields
    ISearch SearchControl { get;}
}

public partial class Results : IResults
{
     //other fields

     public ISearch SearchControl
     {

        get{
        this.Page.Parent.FindControl("UCSearch") as ISearch;}
     }

     protected override void Page_Load(object sender, EventArgs e)
     {
        this.SearchControl.OnSearch += new EventHandler(testMethod);
     }
}
  1. 是否可以在用户控件中使用引用属性来订阅事件和操作状态。它是否会在将来产生任何维护问题。

  2. FindControl和类型转换是否会降低应用程序的性能。

1 个答案:

答案 0 :(得分:1)

1)从另一个对象内部注册来自一个对象的事件是可以的。这就是它们的用途。 :d

2)每次访问SearchControl时都会涉及执行搜索的少量开销。我怀疑它会有什么意义,当然,取决于SearchControl被调用的频率。

但是,如何实施SearchControl将来会出现一些维护问题。通过违反SearchControl中的the Law of Demeter,您已将代码紧密耦合到具有名为Page的控件的"UCSearch"类。

相反,为什么不为SearchControl属性包含set访问器,并让父提供SearchControl的值。这不仅可以使代码更易于维护,而且更松散地耦合,也避免了您的性能问题!作为额外的奖励,很容易为!!!创建单元测试。

public interface IResults
{
     //other fields
    ISearch SearchControl { get; set; }
}


public partial class Results : IResults
{
     //other fields

     private ISearch searchControl;

     public ISearch SearchControl
     {
        get
        {
            return this.searchControl;
        }
        set
        {
            if (this.SearchControl != null)
            {
                this.SearchControl.OnSearch -= new EventHandler(testMethod);
            }

            this.searchControl = value;

            this.SearchControl.OnSearch += new EventHandler(testMethod);
        }
     }
}