0

今天我正在重构一个我创建的库,并在多个平台(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类执行的代码的一部分,因此我基本上可以为客户提供信息。

4

2 回答 2

3

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

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

至于另一件事,这一切都取决于你的类应该实现的逻辑。可能,可能需要更多的解耦。

  • 新的另一个存储库(ADelegateMethod)。这真的是一个棘手的问题,如何正确地做每一件事——需要更多关于一般逻辑的信息,因为可能有不同的方法

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

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

关于活动:

  • 我建议您阅读类似的内容熟悉Rx(反应式扩展) ——它们既现代又令人敬畏(在许多情况下,您可以考虑使用它们而不是事件(如果不在这个处理程序类中,那么在其他一些情况))。(但是,目前我看不到你真的需要在课堂上使用事件的情况)。

另外,至于@durilka 的回答(但是,考虑到他在俄语中的绰号“骗子”,他相信他真的很有趣,他):他正确地提到了(在我开始之前):

  • 删除嵌套类并替换为静态构造函数(如果在基类中)。但这必须仔细重新考虑(特别是如果您真的广泛使用多线程)。
于 2013-11-10T02:47:49.373 回答
0

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

于 2013-11-10T02:15:50.387 回答