rebus-org / Rebus.ServiceProvider

:bus: Microsoft Extensions Dependency Injection container adapter for Rebus
https://mookid.dk/category/rebus
Other
65 stars 32 forks source link

More powerful handler registration API #9

Closed trreeves closed 4 years ago

trreeves commented 6 years ago

How about something like the following, to provide more flexibility and discover-ability when registering handlers:


services.AddRebus(handlerServices => handlerServices
   .AddSingleton<MyHandler1>()
   .AddTransient<MyHandler2>()
   .Add(new MyHandler3())
   .Add(provider => new MyHandler4())

   .AddFromAssemblyOf<MyHandler5>(
       defaultLifetyle: Lifestyle.Singleton,
       customizeRegistrations: customize => customize
          .Ignore<MyHandler6>()
          .IgnoreNamespace("MyCompany.OtherDomain")
          .SetLifestyle<MyHandler7>(Lifestyle.Transient)
          .Set(new MyHandler11())
          .Set(provider => new MyHandler12()))

   .AddFromAssembly(
      assembly: typeof(MyClass).Assembly,
      defaultLifetyle: Lifestyle.Singleton,
      customizeRegistrations: customize => customize
             // as above
    ),

    .AddFromAssemblies(
       assemblyFilter: assembly => assembly.Name.Startswith("MyCompany"),
       defaultLifetyle: Lifestyle.Singleton,
      customizeRegistrations: customize => customize
             // as above
    ),

   configure => configure
       .Logging(l => l.None())
       // etc
    );

What do you think?

mookid8000 commented 6 years ago

Go for it! 😁

I haven't played around with ASP.NET Core yet, so I am not really accustomed to its configuration API – but it looks like you have pretty much nailed its style, so I guess this would be a nice addition to the ServiceProvider container adapter.

mookid8000 commented 4 years ago

With the current version of Rebus.ServiceProvider (5.0.4 at the time of writing), it's possible to

// just register a handler type:
services.AddRebusHandler<SomeHandler>();

// register a Func<IServiceProvider, TService>:
services.AddRebusHandler(p => new SomeHandler(p.GetService<SomethingOptional>()));

// auto-register all Rebus handlers found in a specific type's assembly:
services.AutoRegisterHandlersFromAssemblyOf<SomeHandler>();

// auto-register all Rebus handlers found in an assembly:
services.AutoRegisterHandlersFromAssembly(typeof(SomeType).Assembly);

// auto-register all Rebus handlers found in a dynamically loaded assembly:
services.AutoRegisterHandlersFromAssembly("SomeAssembly");

If anything is missing please don't hesitate to comment on this issue 🙂