Created
January 7, 2020 20:44
-
-
Save seclerp/dd4dcdeba6c98ebee96bdfc5b8117fa1 to your computer and use it in GitHub Desktop.
Example of Autofac dependency injection functional helpers to use into composition manner
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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