首页 > 解决方案 > 如何订阅 .net Core 中的事件?

问题描述

我在 MVC 项目中使用 .net Core 依赖注入。

请求控制器路由并使用注入的服务 (ServiceA) - 在服务方法完成后,在服务的方法中引发事件(Action)。此服务在容器中注册为瞬态。

我有另一个服务也在容器中注册为瞬态(ServiceB),只要它被容器实例化/解析,它就应该订阅 ServiceA 的操作,以便它“连接”到它引发的操作。ServiceB 可以知道 ServiceA,但 ServiceA 不应该知道 ServiceB。

这是如何实现的?由于 ServiceA 对 ServiceB 没有直接依赖关系,因此它永远不会通过依赖注入实例化,因此永远不会订阅 ServiceAs 事件/操作

我知道其他方法,例如实现 IObservable 但想知道这种情况下的方法。

下面是示例:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IServiceA, ServiceA>();
        services.AddTransient<IServiceB, ServiceB>();
    }
}

public interface IServiceA
{
    event Action<string> OnCompletedDoSomething;
    void DoSomething();
}

public class ServiceA : IServiceA
{
    public event Action<string> OnCompletedDoSomething;

    public void DoSomething()
    {
        OnCompletedDoSomething?.Invoke("Did it!");
    }
}

public interface IServiceB
{
    void EventListener(string message);
}

public class ServiceB : IServiceB
{
    private IServiceA _serviceA;

    public ServiceB(IServiceA serviceA)
    {
        _serviceA = serviceA;

        _serviceA.OnCompletedDoSomething += new Action<string>(EventListener);
    }

    public void EventListener(string message)
    {
        Console.WriteLine(message);
    }
}

public class HomeController : Controller
{
    private IServiceA _serviceA;

    public HomeController(IServiceA serviceA)
    {
        _serviceA = serviceA;
    }

    public IActionResult Index()
    {
        _serviceA.DoSomething();
        return View();
    }
}

标签: dependency-injection.net-coreevent-handling

解决方案


推荐阅读