[英]Inject delegate method from derived to base class using constructor
今天,我正在重构一个库,该库可以在多个平台(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
singleton实例,尽管可以根据需要初始化该对象,但目前还不能选择sealed
,因为它还用作另一个对象的基继承类。类在特定的特殊实现中。
将事件更改为静态是否不好? 对我来说似乎不合适,您怎么看? 这种设计可以改善吗?
实际上,我将委托用作需要在特定时间内从其他对象new AnotherRepository(ADelegateMethod)
或BaseHandler
类执行的代码的一部分,因此我基本上可以为客户端提供信息。
我建议更改的主要内容是:
AnotherDelegateMethod
和AnotherOneDelegateMethod
(然后从父类调用)。 至于另一件事,这完全取决于您的类要实现的逻辑。 可能需要更多的去耦 。
新的AnotherRepository(ADelegateMethod)。 这确实是一个棘手的问题,如何正确地做所有事情-由于可能采用不同的方法 ,因此需要更多有关常规逻辑的信息:
protected virtual ISomeRepositoryInterface CreateRepositoryInstance()
(例如); 您可以使用依赖注入到一些外部类中,这些类将使用您的处理程序来传递存储库,实际上与工具或另一个存储库相同(但同样,一切都取决于通用逻辑);
定制处理程序的一种方法是将基本类设置为Generic,并通过提供一些具体的类来继承子级,该逻辑与继承者完全相关,但大多数仅在父类中使用。
关于事件:
此外,至于@durilka的回答(但是,考虑到他的俄语昵称“骗子”,相信他真的很有趣):他正确地提到了(在我进入之前):
摆脱嵌套。 声明私有的默认构造函数。 在返回现有实例或创建新return instance ?? instance = new SomeHandler()
(又名return instance ?? instance = new SomeHandler()
),在您的Instance属性中使用它。 并开始考虑从代表转移到某种消息总线。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.