ドメインイベントをプロジェクトに導入しようとしています。コンセプトはあるUdi漢の記事で説明されて - 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
}
}
}
UPDATE れ、EventDispatcherがOK働いているエラー!手動でハンドラを登録し、ドメインイベントを発生させた場合は、それが動作します。アセンブリのスキャン/レジストレーションが私の問題です。 手動登録コード...
builder.RegisterType<SendWebQuestionToCSO >().As<IHandleDomainEvents<JobNoteCreated>>();
は、どのように私は彼らがこの
public class SendWebQuestionToCSO : IHandleDomainEvents<JobNoteCreated>
パーフェクトニック!私はあなたの今後のコースを楽しみにしています! – CRG
ああ、はい、よりスムーズです。私は15の担当者の強盗! –
Heheあなたがそれを必要としているように、L.;)あなたは私の投票にもかかわらず。 –