如何在.net Core中订阅事件?

时间:2018-12-08 14:44:03

标签: dependency-injection .net-core event-handling

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

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

我还有另一个服务也已在容器中注册为临时服务(ServiceB),每当容器实例化/解析ServiceA时,该服务都应订阅ServiceA的操作,以便将其“连接”到由它引发的Action 。 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();
    }
}

0 个答案:

没有答案