asp.net核心 - 在应用程序启动后创建一个类的实例

时间:2018-04-24 06:55:45

标签: c# asp.net-core instance publish-subscribe

我有一些应该在应用程序启动后实例化的类。在我的情况下,某些控制器可以触发一个事件,我希望此时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的实例?

或许还有更好的解决方案?

2 个答案:

答案 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();
    // …
}

当然,只有当EventHandlerEventPublisher都注册为单身依赖时才有意义。