我对此一直有点麻烦。

安德烈亚斯·厄隆德(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()。

10-07 21:03