dependency-injection - 如何订阅 .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();
}
}
解决方案
推荐阅读
- api - Airflow BigQueryGetDataOperator max_results 参数不起作用
- database - 图中任意两个表之间不能有多个关系路径
- jestjs - 状态混乱
- python - 将 ASCII 码序列作为整数转换为字符串
- javascript - Chrome 中的时间
- android - 我什么时候必须奖励播放器在核心(libgdx)中观看视频?
- javascript - 使用 ReactGA 的 Google Analytics(分析)电子商务
- message - Leverice 中的头像图像
- python - Python - 索引超出范围
- pyspark - PySpark 脚本替换所有值