C# 在将委托和事件与IOC容器一起使用时避免捕获依赖关系
假设我有一个控制台应用程序或Windows服务,并且在IOC容器中使用依赖项注入(在我的特定情况下,我使用的是Autofac) IOC容器解析的类之一是WorkDoer类,它有一个长时间运行的DoWork(Args Args)方法。当DoWork(Args Args)完成时,将引发一个自定义事件(WorkOne)。在我的例子中,当带有参数的消息从消息队列中取出时,会触发DoWork 我还有一个通知程序类,我想让它订阅我的WorkOne事件 具体地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
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——这是我希望我的通知程序能够使用的地方
我确实看到了,但我希望避免使用激活的
或代理注册的建议,因为前面提到了捕获的依赖关系问题。目前,您的通知使用的是观察者设计模式。您可以直接注册事件处理程序。这将导致组件之间的紧密耦合
对于上面的需求,使用事件聚合器的发布/订阅设计模式会更好。发布服务器和订阅服务器只是松散耦合的。两者都只知道事件聚合器。事件聚合器被注入两者,并充当中介器/门面/适配器
有许多可能的实现。见: