C# 在将委托和事件与IOC容器一起使用时避免捕获依赖关系

C# 在将委托和事件与IOC容器一起使用时避免捕获依赖关系,c#,events,dependency-injection,delegates,autofac,C#,Events,Dependency Injection,Delegates,Autofac,假设我有一个控制台应用程序或Windows服务,并且在IOC容器中使用依赖项注入(在我的特定情况下,我使用的是Autofac) IOC容器解析的类之一是WorkDoer类,它有一个长时间运行的DoWork(Args Args)方法。当DoWork(Args Args)完成时,将引发一个自定义事件(WorkOne)。在我的例子中,当带有参数的消息从消息队列中取出时,会触发DoWork 我还有一个通知程序类,我想让它订阅我的WorkOne事件 具体地 public class Notifier

假设我有一个控制台应用程序或Windows服务,并且在IOC容器中使用依赖项注入(在我的特定情况下,我使用的是Autofac)

IOC容器解析的类之一是WorkDoer类,它有一个长时间运行的DoWork(Args Args)方法。当DoWork(Args Args)完成时,将引发一个自定义事件(WorkOne)。在我的例子中,当带有参数的消息从消息队列中取出时,会触发DoWork

我还有一个通知程序类,我想让它订阅我的WorkOne事件

具体地

public class Notifier
    {
        public void Subscribe(WorkDoer w)
        {
            w.WorkDone += new WorkDoer.WorkDoneHandler(Notify);
        }
        private void Notify(WorkDoer w, EventArgs e)
        {
            //do some kind of notification decoupled from my WorkDoer
            //concretely I'd like to push a SignalR message or something.
        }
    }
现在我有了我的WorkDoer,它负责运行一些长时间运行的业务逻辑并引发一个事件。然后,理论上,我有一个通知程序,它可以侦听该事件并运行一些与业务逻辑分离的逻辑,例如将通知推送到该解决方案中的MVC页面,或者发布另一个消息队列消息,或者类似的事情

我的解决方案中的项目是

  • App.WorkerService——包含我的WorkDoer控制台应用程序和DependencyConfig
  • 这是一个包含WorkDoer使用的所有业务逻辑的库
  • App.Notification——这是我希望我的通知程序能够使用的地方
所以我的问题是:

在我的WorkerService Program.cs中,我已向Autofac的单实例范围注册了我的WorkDoer。这意味着它是一个暂时的实例,可以消失。因此,我不确定如何在我的程序.cs的主要方法中有效地订阅它的WorkOne事件,因为它最终会被处理掉。我可以让它使用单例作用域来避免这种情况,但是我已经在长时间运行的作用域中捕获了WorkDoer的所有依赖项,这是我不想做的

我的通知程序位于单例作用域中,这样我就不会丢失现有订阅--我不确定这是否是一种不好的做法,我很乐意更改它

基本上,重要的是我希望将我的业务逻辑与通知逻辑放在一个单独的项目中,以避免将通知代码泄漏到我的业务逻辑中。我还希望能够轻松地添加/删除/更改通知程序类型(信号器、日志文件、MQ等)。我想使用C#event和delegate系统来实现这一点(在这里似乎相当相关),但我不确定如何管理依赖范围


我确实看到了,但我希望避免使用激活的
或代理注册的建议,因为前面提到了捕获的依赖关系问题。

目前,您的通知使用的是观察者设计模式。您可以直接注册事件处理程序。这将导致组件之间的紧密耦合

对于上面的需求,使用事件聚合器的发布/订阅设计模式会更好。发布服务器和订阅服务器只是松散耦合的。两者都只知道事件聚合器。事件聚合器被注入两者,并充当中介器/门面/适配器

有许多可能的实现。见: