Я использую ядро зависимости .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();
}
}