gpt4 book ai didi

autofac - 将 Autofac 与领域事件结合使用

转载 作者:行者123 更新时间:2023-12-01 16:19:15 28 4
gpt4 key购买 nike

我正在尝试将域事件引入项目中。 Udi Dahan 的帖子 - http://www.udidahan.com/2009/06/14/domain-events-salvation/ 中描述了这一概念。

这是域事件代码

public interface IDomainEvent { }

public interface IHandleDomainEvents<T> where T : IDomainEvent
{
void Handle(T args);
}

public interface IEventDispatcher
{
void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent;
}

public static class DomainEvents
{
public static IEventDispatcher Dispatcher { get; set; }

public static void Raise<TEvent>(TEvent eventToRaise) where TEvent : IDomainEvent
{
Dispatcher.Dispatch(eventToRaise);
}
}

最重要的部分是 IEventDispatcher 实现,它将域事件与引发事件时需要发生的任何事情分离。诀窍是通过容器连接这个耦合。这是我的尝试

用于注册所有域事件处理程序的代码...

        var asm = Assembly.GetExecutingAssembly();
var handlerType = typeof(IHandleDomainEvents<>);

builder.RegisterAssemblyTypes(asm)
.Where(t => handlerType.IsAssignableFrom(t)
&& t.IsClass
&& !t.IsAbstract)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();

并解析调度程序中的所有事件处理程序。问题是没有解决任何处理程序。

public class EventDispatcher : IEventDispatcher
{
private readonly IContainer _container;

public EventDispatcher(IContainer container)
{
_container = container;
}

public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
var handlers = _container.Resolve<IEnumerable<IHandleDomainEvents<TEvent>>>().ToList();
handlers.ForEach(handler => handler.Handle(eventToDispatch));
}
}

所以我没有正确注册事件处理程序或没有解析它们。如何检查注册是否有效?

处理程序的示例代码

public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
{
private readonly IConfig _config;

public SendWebQuestionToCSO(IConfig config)
{
_config = config;
}

public void Handle(JobNoteCreated args)
{
var jobNote = args.JobNote;
using(var message = new MailMessage())
{
var client = new SmtpClient {Host = _config.SmtpHostIp};
message.From = new MailAddress(_config.WhenSendingEmailFromWebProcessUseThisAddress);
...... etc
}
}
}

更新经过一番尝试和错误后,EventDispatcher 工作正常!如果我手动注册一个处理程序,然后触发域事件,它就会起作用。程序集扫描/注册是我的问题。手动注册码...

builder.RegisterType<SendWebQuestionToCSO >().As<IHandleDomainEvents<JobNoteCreated>>();

那么我如何扫描所有程序集以查找所有 IHandleDomainEvents<>鉴于它们看起来像这样

public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>

最佳答案

正如 Peter 指出的,注册问题出在您的 Where() 子句上。

扫描程序集时,Autofac 根据您指定的服务自动过滤组件,因此使用以下方法同样正确:

builder.RegisterAssemblyTypes(asm)
.AsClosedTypesOf(handlerType)
.InstancePerLifetimeScope();

关于autofac - 将 Autofac 与领域事件结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5629676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com