我正在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();
}
}