我有一些应该在应用程序启动后实例化的类。在我的情况下,某些控制器可以触发一个事件,我希望此时EventPublisher
已经拥有订阅者。
class SomeEventHandler {
public SomeEventHandler(EventPublisher publisher) {
publisher.Subscribe(e => {}, SomeEventType);
}
}
class SomeController : Controller {
private EventPublisher _publisher;
public SomeController(EventPublisher publisher) {
_publisher = publisher;
}
[HttpGet]
public SomeAction() {
_publisher.Publish(SomeEventType);
}
}
调用SomeEventHandler
方法时是否可以拥有Publish
的实例?
或许还有更好的解决方案?
答案 0 :(得分:2)
是的,使用依赖注入,它将负责在控制器构造函数中获取实例。
services.AddScoped<EventHandler, EventPublisher>(); or
services.AddTransient<EventHandler, EventPublisher>(); or
services.AddSingleton<EventHandler, EventPublisher>();
有关DI的更多信息:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.0
答案 1 :(得分:0)
如果不将EventHandler
作为控制器或EventPublisher
内的直接依赖项,则在调用Publish
并且存在处理程序侦听时无法确定是否创建了实例你的活动。
因此,您需要确保在某处创建处理程序。我个人会在Startup的Configure
方法中执行此操作,因为在那里注入依赖项非常容易,这样,在应用程序启动时就会创建一个实例:
public void Configure(IApplicationBuilder app, EventHandler eventHandler)
{
// you don’t actually need to do anything with the event handler here,
// but you could also move the subscription out of the constructor and
// into some explicit subscribe method
//eventHandler.Subscribe();
// …
app.UseMvc();
// …
}
当然,只有当EventHandler
和EventPublisher
都注册为单身依赖时才有意义。