我在页面上有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);
}
}
是否可以在用户控件中使用引用属性来订阅事件和操作状态。它是否会在将来产生任何维护问题。
FindControl和类型转换是否会降低应用程序的性能。
答案 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);
}
}
}