Как подписаться на событие в .net Core? - PullRequest
0 голосов
/ 08 декабря 2018

Я использую ядро ​​зависимости .net Core в проекте MVC.

Маршрут контроллера запрашивается и использует внедренную службу (ServiceA), которая - после завершения метода служб вызывает событие (действия) в методе службы.Эта услуга зарегистрирована как переходная в контейнере.

У меня есть другая служба, которая также зарегистрирована в контейнере как переходная (ServiceB), которая должна подписываться на действие ServiceA всякий раз, когда он создается / разрешается контейнером, чтобы он был «подключен» к действию, котороеподнятый этим.ServiceB может знать о ServiceA, но ServiceA не должна знать о ServiceB.

Как это достигается?Поскольку ServiceA не имеет непосредственной зависимости от ServiceB, он никогда не создается путем внедрения зависимости и поэтому никогда не подписывается на ServiceAs Event / Action

. Мне известны другие подходы, такие как реализация 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...