Delegate Registration

Sometimes you really need a bit more power behind constructing a service. For these times you may find yourself in one of the following scenarios:

  • You just need to perform some Action like:
public static IBackendService CreateBackendService()
{
    return new BackendService
    {
        Uri = Constants.BackendUri
    };
}
  • You need to resolve something to do a more complex look up and properly construct your type:
public static IBackendService CreateBackendService(IContainerProvider containerProvider)
{
    var options = containerProvider.Resolve<IOptions>();
    return containerProvider.Resolve<IBackendService>((typeof(Uri), options.BackendUri));
}

Note

This supports both Delegates with IContainerProvider and IServiceProvider

Regardless of which way you need to resolve service the Delegate Registration extensions really help out for those scenarios where you can't just simply pass a raw implementing type.

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterDelegate<IFoo>(FooFactory);
    containerRegistry.RegisterDelegate<IBar>(BarFactory);
}

private static IFoo FooFactory() => new Foo();

private static IBar BarFactory(IContainerProvider container)
{
    var options = container.Resolve<IOptions>();
    return new Bar { HasCode = options.HasCode };
}

private static IBar BarFactory(IServiceProvider serviceProvider)
{
    var options = serviceProvider.GetService<IOptions>();
    return new Bar { HasCode = options.HasCode };
}