我对此一直有点麻烦。
安德烈亚斯·厄隆德(AndreasÖhlund)对此问题做了解答,但我一直无法使用他给出的建议使它生效。
这是我的设置:
public abstract class CommandHandler<T> : IHandleMessages<T>, IDomainReadRepository where T : Command
{
public IDomainRepository DomainRepository { get; set; }
protected abstract void OnProcess(T command);
public TAggregate GetById<TAggregate>(Guid id) where TAggregate : IEventProvider, new()
{
return DomainRepository.GetById<TAggregate>(id);
}
public void Handle(T message)
{
OnProcess(message);
// Domain repository will save.
}
}
这个想法是特定的命令处理程序重写OnProcess方法并执行其操作,然后DomainRepository将保存所有内容。
这是我注册组件的方式:
public class EndpointConfig : IConfigureThisEndpoint, AsA_Server, IWantCustomInitialization
{
public void Init()
{
Configure.With().DefiningCommandsAs(c => c.Namespace != null && c.Namespace.EndsWith("Commands"));
Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<DomainRepository>(DependencyLifecycle.InstancePerCall);
Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<EventStore.Sql.EventStore>(DependencyLifecycle.InstancePerCall);
Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<MongoDbObjectSecurityDescriptorRepository>(DependencyLifecycle.InstancePerCall);
Configure.Instance.DefaultBuilder().Configurer.ConfigureComponent<LocalTenantConfig>(DependencyLifecycle.InstancePerCall);
}
}
这些都是DomainRepository使用的所有链下对象。但是,当我收到命令时,DomainRepository为空。如果我注释掉注册DomainRepository所需对象的行,则实际上会收到一条错误消息,指出它创建失败(Autofac DependencyResolutionException)。
应当注意,所有其他对象都使用构造函数注入(它们取自先前存在的项目)。我尝试将其更改为使用公共资产注入,但没有任何区别。
如果有人可以指出我在这里做错了,将不胜感激!
最佳答案
将init方法中的代码移到另一个实现INeedInitialization的类中。在此,使用Configure.Instance而不是Configure.With(),也不要使用Configure.Instance.DefaultBuilder()。