今天我正在重构一个我创建的库,并在多个平台(WPF、WF、WP7、WP8)之间共享代码。
这个想法是我使用继承来扩展类中的功能。顶级类向客户端公开几个事件,该事件在一个方法中引发,该方法使用接受一些参数的构造函数向下传递给基类。
该对象基本上用作单例。
例子:
public class SomeHandler : BaseHandler
{
public event EventHandler<Custom1EventArgs> RequestCompleted = delegate {};
public event EventHandler<Custom2EventArgs> ActionHandled = delegate { };
protected SomeHandler()
: base(new CustomUtil(), new CustomRepository(),
new AnotherRepository(ADelegateMethod),
AnotherDelegateMethod, AnotherOneDelegateMethod) {}
#region [ Singleton ]
public static SomeHandler Instance
{ get { return Nested.instance;} }
class Nested
{
internal static readonly SomeHandler instance = new SomeHandler ();
}
#endregion
private static void ADelegateMethod(Custom1EventArgs args)
{
Instance.RequestCompleted (Instance, args);
}
private static void AnotherDelegateMethod(
Custom2EventArgs args, CustomObject result)
{
// Do stuff....
AnotherCustomObject cusObj = new AnotherCustomObject(args);
Instance.ActionHandled (Instance, cusObj);
}
private static void AnotherOneDelegateMethod(CustomObject result)
{
// Do some stuff...
}
}
好的,如果你注意到了,我需要将委托方法标记为静态,因为注入发生在构造函数参数中。但这迫使我将事件设为静态。为了解决这个问题,我依赖于用户总是使用Instance
我的对象的单例实例这一事实,尽管可以根据需要初始化对象,但sealed
目前不是一个选项,因为它也被用作另一个类的基继承类具体的特殊实现。
将事件更改为静态是不是很糟糕?我觉得不太合适,你怎么看?这个设计能变得更好吗?
实际上,我将委托用作需要在特定时间从其他对象new AnotherRepository(ADelegateMethod)
或BaseHandler
类执行的代码的一部分,因此我基本上可以为客户提供信息。