Lamar with MediatR registering constructor dependencies, is there a better way?

479 Views Asked by At

I am using Lamar and i have added a load of dependencies which work in my controllers.

When i try to use a handler from MediarR i am having to explicitly set the Ctor dependancies like so:

serviceRegistry
            .ForConcreteType<UpdateStockItemPricingHandler>().Configure
            .Scoped()
            .Ctor<ClientAppContext>("dbContext").Is<ClientAppContext>();

I am going to have to do this for every single handler? seems very tedious, the ClientAppContext dependencie is already registered in the container so why does the handler not auto inject it? without needing the above code.

Do i need to somehow make Handlers aware of all the dependencies that are in my container?

Here is an example of some dependencies i have registered:

serviceRegistry.Scan(scanner =>
        {
            scanner.AssemblyContainingType<Ping>();
            scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
            scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
            scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionAction<>));
            scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionHandler<,,>));
        });
        
        serviceRegistry.For<MediatR.IMediator>().Use<Mediator>().Transient();
        serviceRegistry.For<ServiceFactory>().Use(ctx => ctx.GetInstance);

        serviceRegistry
            .ForConcreteType<ServiceHealthCheckHandler>().Configure
        .Scoped()
            .Ctor<IService>("environmentService").Is<EnvironmentService>()
            .Transient();
        
        serviceRegistry
            .ForConcreteType<GetStockItemPricingHandler>().Configure
            .Scoped()
            .Ctor<ClientAppContext>("dbContext").Is<ClientAppContext>();
        
        serviceRegistry
            .ForConcreteType<UpdateStockItemPricingHandler>().Configure
            .Scoped()
            .Ctor<ClientAppContext>("dbContext").Is<ClientAppContext>();



        var mapperConfig = new MapperConfiguration(mc => mc.AddProfile(new MappingProfile()));
        IMapper mapper = mapperConfig.CreateMapper();
        services.AddSingleton(mapper);
0

There are 0 best solutions below