2

私は私のプロジェクト MediatR で使用しています。これは私がサービスクラスに持っているものです:

public class WebShopServices : IWebShopServices
{
    private readonly IMediator _mediator;

    public WebShopServices(IMediator mediator)
    {
         _mediator = mediator;
    }
    public void UpdateCustomerAddress(UpdateAddressInformationCommand updateAddressInformation)
        {
            _mediator.Send(updateAddressInformation);
        }
}

これは私のハンドラーです

public class UpdateCustomerAddressHandler : RequestHandler<UpdateAddressInformationCommand>
{
    private readonly OnlineSalesService _client;
    private readonly IDataContractsFactory _factory;
    private readonly IParameterValidator _validator;

    public UpdateCustomerAddressHandler(OnlineSalesService client, 
        IDataContractsFactory factory, IParameterValidator validator)
    {
        _client = client;
        _factory = factory;
        _validator = validator;
    }

    protected override void HandleCore(
        UpdateAddressInformationCommand updateAddressInformation)
    {
        _validator.Validate(updateAddressInformation);

        var updateAddressCommand = 
            _factory.CreateCustomerDefaultAddressCommand(updateAddressInformation);

        try
        {
            _client.SetCustomerDefaultAddress(updateAddressCommand);
        }
        catch (Exception ex)
        {
            throw new CustomerException("Something happened with the service.", ex);
        }
    }
}

これは私のモデルクラスです:

public class UpdateAddressInformationCommand : IRequest
{
    public string CustomerNumber { get; set; }

    public AddressInformation AddressInformation { get; set; }
}

そして、これは私が依存性注入構成で書いたものです:

builder.RegisterSource(new ContravariantRegistrationSource());
builder.RegisterAssemblyTypes(typeof (IMediator).Assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(typeof (Ping).Assembly).AsImplementedInterfaces();
builder.RegisterInstance(Console.Out).As<TextWriter>();
builder.Register<SingleInstanceFactory>(ctx => {
    var c = ctx.Resolve<IComponentContext>();
    return t => c.Resolve(t);
});
builder.Register<MultiInstanceFactory>(ctx => {
    var c = ctx.Resolve<IComponentContext>();
    return t => (IEnumerable<object>)c.Resolve(typeof(IEnumerable<>).MakeGenericType(t));
});

builder.RegisterType<GetCustomerDetailsResultHandler>()
    .As<IRequestHandler<GetCustomerDetailsQuery,GetCustomerDetailsResult>>();
builder.RegisterType<UpdateCustomerAddressHandler>()
    .As<RequestHandler<UpdateAddressInformationCommand>>();

そして、それは私にこの例外を与え続けます:

{"要求されたサービス 'MediatR.IRequestHandler`2[[Service.DataContracts.UpdateAddressInformationCommand, Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[MediatR.Unit, MediatR, Version=2.0.0.0, Culture =neutral, PublicKeyToken=null]]' は登録されていません。この例外を回避するには、コンポーネントを登録してサービスを提供するか、IsRegistered() を使用してサービスの登録を確認するか、ResolveOptional() メソッドを使用してオプションの依存関係を解決してください。 "}

この問題を解決する方法を知っている人はいますか?

4

2 に答える 2

0

これを試して、次の方法で IRequestHandler を登録してください。

builder.RegisterAssemblyTypes(assembly).As(t => t.GetInterfaces()
            .Where(i => i.IsClosedTypeOf(typeof(IRequestHandler<,>)))
            .Select(i => new KeyedService(HandlerKey, i)));

mediatr と Autofac を使いやすくするには、MediatR.Extensions https://github.com/bernos/MediatR.Extensionsを試してください。

于 2015-09-20T10:57:05.220 に答える