微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ASP.NET中无法使EventAggregator与AutoFac一起使用

如何解决在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 举报,一经查实,本站将立刻删除。