Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用构造函数将派生的委托方法注入基类_C#_Oop_Dependency Injection_Delegates_Design Principles - Fatal编程技术网

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

C# 使用构造函数将派生的委托方法注入基类,c#,oop,dependency-injection,delegates,design-principles,C#,Oop,Dependency Injection,Delegates,Design Principles,今天,我重新分解了我创建的库,并在多个平台(WPF、WF、WP7、WP8)上共享代码 我的想法是使用继承来扩展类中的功能。顶级类向客户端公开两个事件,此事件在方法中引发,该方法使用接受某些参数的构造函数传递给基类 该对象基本上用作单例 例如: public class SomeHandler : BaseHandler { public event EventHandler<Custom1EventArgs> RequestCompleted = delegate {};

今天,我重新分解了我创建的库,并在多个平台(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...
   }
}
公共类SomeHandler:BaseHandler
{
公共事件EventHandler RequestCompleted=委托{};
public event EventHandler ActionHandled=委托{};
受保护的SomeHandler()
:base(新CustomUtil(),新CustomRepository(),
新的另一个存储库(ADelegateMethod),
另一个DelegateMethod,另一个DelegateMethod){}
#地区[单身]
公共静态SomeHandler实例
{get{return Nested.instance;}}
类嵌套
{
内部静态只读SomeHandler实例=新的SomeHandler();
}
#端区
专用静态void ADelegateMethod(Custom1EventArgs参数)
{
Instance.RequestCompleted(实例,args);
}
私有静态void另一个delegatemethod(
Custom2EventArgs参数,CustomObject结果)
{
//做事。。。。
AnotherCustomObject cusObj=新的AnotherCustomObject(args);
Instance.ActionHandled(实例,cusObj);
}
私有静态void另一个OneDelegateMethod(CustomObject结果)
{
//做些事情。。。
}
}
好的,如果您注意到了,我需要将委托方法标记为静态的,因为注入发生在构造函数参数中。但这迫使我将事件设置为静态。为了解决这个问题,我依赖于这样一个事实:用户总是使用我的对象的
实例
单例实例,尽管如果他们愿意,可以初始化该对象,
sealed
目前不是一个选项,因为在特定的特殊实现中,它也被用作另一个类的基类继承类

将事件更改为静态是否不好?我觉得这不合适,你觉得呢? 这个设计能变得更好吗


实际上,我使用委托作为代码的一部分,需要在特定时间内从其他对象
新的另一个存储库(ADelegateMethod)
BaseHandler
类执行这些委托,这样我基本上可以向客户机提供信息。

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

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

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

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

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

  • 用相应的虚拟方法替换
    另一个delegateMethod
    另一个delegateMethod
    传递(然后从父类调用)
至于另一件事,这完全取决于您的类应该实现的逻辑可能,可能需要一些更多的解耦

  • 新建另一个存储库(ADelegateMethod)。如何做好每件事,这确实是一个棘手的问题——需要更多关于一般逻辑的信息,尽可能采用不同的方法:

    • 您也可以使用虚拟方法来替换它,如ADelegateMethod——与上面提到的两种方法相同,但新的另一个存储库是
      受保护的虚拟异构体位置接口CreateRepositoryInstance()
      (例如)
    • 您可以使用依赖项注入到一些外部类中,这些外部类将使用您的处理程序将数据传递到存储库,实际上与工具或另一个存储库相同(但是,所有内容都取决于一般逻辑)

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

关于活动:

    <> Li >我建议你读一些类似的东西,并且通常熟悉<强> RX(反应扩展)它们是现代的和很棒的(在很多情况下,你可以考虑使用它们而不是事件)(如果不是在这个处理程序类中,那么在其他一些情况下)。(但是,目前我看不到您真正需要在类中使用事件的情况)

另外,关于@durilka的回答(然而,考虑到他在俄语中的绰号“骗子”,相信他真的很有趣,他):他(在我进入之前)正确地提到: