如何解决在ASP.NET中无法使EventAggregator与AutoFac一起使用
我在使用AutoFac的ASP.NET MVC应用程序中需要一个简单的EventAggregator。我看过https://github.com/NimaAra/Easy.MessageHub-我真的很喜欢简单和轻巧,因为我觉得完整的服务总线实现可能对我的需求来说太过分了。但是,如果有人有更好的方法,我会不知所措:)
但是-我似乎无法使设置与我的Web应用程序一起使用。我有一个非常简单的设置:
HomeController(仅用于发起呼叫)
public class HomeController : Controller
{
private readonly IPublishStuffService _publishStuffService;
private readonly IMessageHub _hub;
public HomeController(IPublishStuffService publishStuffService,IMessageHub hub)
{
_publishStuffService = publishStuffService;
_hub = hub;
_hub.RegisterGlobalHandler((type,eventObject) => Debug.WriteLine($"Type: {type} - Event: {eventObject}"));
}
public ActionResult Index()
{
_publishStuffService.PublishStuff("Hello world");
return View();
}
}
PublishStuffService
public class PublishStuffService : IPublishStuffService
{
private readonly IMessageHub _hub;
public PublishStuffService(IMessageHub hub)
{
_hub = hub;
}
public void PublishStuff(string message)
{
_hub.Publish(message);
}
}
SubscribetoStuffService
public class SubscribetoStuffService : ISubscribetoStuffService
{
private readonly IMessageHub _hub;
public SubscribetoStuffService(IMessageHub hub)
{
_hub = hub;
_hub.Subscribe<string>(HandleSubscription);
}
public void HandleSubscription(string message)
{
Debug.WriteLine("===================");
Debug.WriteLine(message);
Debug.WriteLine("===================");
}
}
我的GlobalHandler可以很好地打印出“ Hello world”消息-但我的订阅服务从未被调用。我想这可能是我的AutoFac设置出现问题-但我不确定如何处理这种情况。
我的AutoFac配置(使用AutoFac.MVC5)如下所示:
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(HomeController).Assembly);
builder.RegisterModelBinders(typeof(HomeController).Assembly);
builder.RegisterModelBinderProvider();
builder.RegisterModule<AutofacWebTypesModule>();
builder.RegisterSource(new ViewRegistrationSource());
builder.RegisterFilterProvider();
// Register individual components
builder.RegisterType(typeof(SubscribetoStuffService)).As<ISubscribetoStuffService>().InstancePerLifetimeScope();
builder.RegisterType(typeof(PublishStuffService)).As<IPublishStuffService>().InstancePerLifetimeScope();
builder.RegisterType(typeof(MessageHub)).As<IMessageHub>().SingleInstance();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
任何人都可以帮助我弄清楚如何确保消息中心在整个Web应用程序中持久存在,以便我可以让不同的类订阅发布到消息中心的不同事件。 基本上,我正在寻找Jimmy Bogards Mediatr库的Notification部分-顺便说一句,它很完美-但我觉得,如果我只打算使用Notification设置,Mediatr的实现可能会有点过多:
更新 如果我在与发布相同的位置(此处位于HomeController中)向ISubscribetoStuffService添加依赖项,则实际上可以触发订阅者事件:
public class HomeController : Controller
{
private readonly IPublishStuffService _publishStuffService;
private readonly IMessageHub _hub;
private readonly ISubscribetoStuffService _subscribetoStuffService;
public HomeController(IPublishStuffService publishStuffService,IMessageHub hub,ISubscribetoStuffService subscribetoStuffService)
{
_publishStuffService = publishStuffService;
_hub = hub;
_subscribetoStuffService = subscribetoStuffService;
}
...
}
这显然解决了订户。但这并没有真正的帮助,因为它破坏了我的依赖关系之间松散耦合的目的。
问题就变成了-我如何获得AutoFac来解析我的订阅者,而不必在我向消息总线发布内容的任何地方都将它们添加为依赖项?能做到吗?
更新2 为AutoFac找到了这个漂亮的发布/订阅扩展:https://github.com/jonstelly/AutofacEvents。在启动事件聚合器并使用AutoFac运行时,它可以立即完成我需要的所有操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。