繁体   English   中英

使用构造函数将委托方法从派生注入基类

[英]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类执行的代码的一部分,因此我基本上可以为客户端提供信息。

我建议更改的主要内容是:

  • 用相应的虚方法替换传递的AnotherDelegateMethodAnotherOneDelegateMethod (然后从父类调用)。

至于另一件事,这完全取决于您的类要实现的逻辑。 可能需要更多的去耦

  • 新的AnotherRepository(ADelegateMethod)。 确实是一个棘手的问题,如何正确地做所有事情-由于可能采用不同的方法 ,因此需要更多有关常规逻辑的信息:

    • 您也可以用虚拟方法来代替它,例如ADelegateMethod-与上面提到的两种方法相同,但是新的AnotherRepository作为protected virtual ISomeRepositoryInterface CreateRepositoryInstance() (例如);
    • 您可以使用依赖注入到一些外部类中,这些类将使用您的处理程序来传递存储库,实际上与工具或另一个存储库相同(但同样,一切都取决于通用逻辑);

    • 定制处理程序的一种方法是将基本类设置为Generic,并通过提供一些具体的类来继承子级,该逻辑与继承者完全相关,但大多数仅在父类中使用。

关于事件:

  • 我建议您阅读这样的内容,并且通常熟悉Rx(响应式扩展) -它们非常现代且很棒(在许多情况下您可以考虑使用它们而不是事件如果不在此处理程序类中,则在其他情况下)情况 ))。 (但是,目前我看不到当您确实需要在类中使用事件时的情况)。

此外,至于@durilka的回答(但是,考虑到他的俄语昵称“骗子”,相信他真的很有趣):他正确地提到了(在我进入之前):

  • 删除嵌套类并替换为静态构造函数 (如果在基类中)。 但这必须仔细地重新考虑(特别是如果您真的广泛使用多线程)。

摆脱嵌套。 声明私有的默认构造函数。 在返回现有实例或创建新return instance ?? instance = new SomeHandler() (又名return instance ?? instance = new SomeHandler() ),在您的Instance属性中使用它。 并开始考虑从代表转移到某种消息总线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM