Skip to content

Instantly share code, notes, and snippets.

@seclerp
Created January 7, 2020 20:44
Show Gist options
  • Save seclerp/dd4dcdeba6c98ebee96bdfc5b8117fa1 to your computer and use it in GitHub Desktop.
Save seclerp/dd4dcdeba6c98ebee96bdfc5b8117fa1 to your computer and use it in GitHub Desktop.
Example of Autofac dependency injection functional helpers to use into composition manner
module DependencyUtils
open Autofac
open Microsoft.Extensions.Configuration
let addTransientAs<'service, 'implementation> (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>() |> ignore
services
let addScopedAs<'service, 'implementation> (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>().InstancePerLifetimeScope() |> ignore
services
let addSingletonAs<'service, 'implementation> (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>().SingleInstance() |> ignore
services
let addSingletonFactory<'service> (factory: IComponentContext -> 'service) (services: ContainerBuilder) =
services.Register(factory).As<'service>().SingleInstance() |> ignore
services
let addTransientNamedAs<'service, 'implementation> name (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>().Named(name) |> ignore
services
let addScopedNamedAs<'service, 'implementation> name (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>().Named(name).InstancePerLifetimeScope() |> ignore
services
let addSingletonNamedAs<'service, 'implementation> name (services: ContainerBuilder) =
services.RegisterType<'implementation>().As<'service>().Named(name).SingleInstance() |> ignore
services
let addSingletonNamedFactory<'service> (factory: IComponentContext -> 'service) (name: string) (services: ContainerBuilder) =
services.Register(factory).As<'service>().Named(name).SingleInstance() |> ignore
services
let addTransient<'service> =
addTransientAs<'service, 'service>
let addScoped<'service> =
addScopedAs<'service, 'service>
let addSingleton<'service> =
addSingletonAs<'service, 'service>
let addTransientNamed<'service> =
addTransientNamedAs<'service, 'service>
let addScopedNamed<'service> =
addScopedNamedAs<'service, 'service>
let addSingletonNamed<'service> =
addSingletonNamedAs<'service, 'service>
let addSingletonInstance<'service when 'service : not struct> (instance: 'service) (services: ContainerBuilder) =
services.RegisterInstance(instance) |> ignore
services
// Container module boilerplate to register from register function below. Used in Startup as entry point
// for injection
type DependenciesModule(register : IConfiguration -> ContainerBuilder -> ContainerBuilder, configuration: IConfiguration) =
inherit Module()
override __.Load(builder: ContainerBuilder) =
register configuration builder |> ignore
let makeModule register configuration = DependenciesModule(register, configuration)
let addModule module' (builder: ContainerBuilder) =
builder.RegisterModule(module') |> ignore
// Example of using
// ...
open DependencyUtils
// ...
let register configuration =
addSingletonNamedFactory<IService2> (fun _ -> someFactory2 configuration) "Some cool name"
>> addSingletoFactory<IService3> (fun _ -> someFactory3 configuration)
>> addTransientNamedAs<IService, Service> "Some name"
member this.ConfigureContainer(builder: ContainerBuilder) =
let module' = makeModule register this.Configuration
builder |> addModule module'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment