IoC EnvUser Guide
Overview
IoC Env is a library for determining the application environment, be it development, test or production.
It sniffs environment variables and program arguments, and offers a manual override option - useful for testing.
Quick Start
- Create a text file called
Example.fan
using afIoc using afIocConfig using afIocEnv const class Example { @Inject
// --> Inject IocEnv serviceconst IocEnv iocEnv @Config { id="afIocEnv.isProd" }// --> Inject Config valuesconst Bool isProd new make(|This| in) { in(this) } Void print() { echo("The environment is '${iocEnv.env}'") if (isProd) { echo("I'm in Production!") } else { echo("I'm in Development!!") } } }// ---- Standard IoC Support Classes ----class Main { Void main() { registry := RegistryBuilder() { addModulesFromPod("afIocEnv") addService(Example#) }.build() example := (Example) registry.dependencyByType(Example#) example.print() } } - Run
Example.fan
as a Fantom script from the command line:C:\> fan Example.fan -env PRODUCTION [info] [afIocEnv] Setting from environment variable 'env' : development [info] [afIocEnv] Overriding from cmd line argument '-env' : PRODUCTION The environment is 'PRODUCTION' I'm in Production!
Usage
IocEnv Injection
The IocEnv class is the main IoC service with handy utility methods. Inject it as usual:
using afIoc::Inject using afIocEnv::IocEnv @Inject IocEnv iocEnv ... Void wotever() { if (iocEnv.isDev) { ...// dev only stuff} }
Config Injection
You can also inject IoC Config values. See IocEnvConfigIds for a complete list of injectable values:
using afIoc::Inject using afIocConfig::Config @Config { id="afIocEnv.isDev" } Bool isDev ... Void wotever() { if (isDev) { ...// dev only stuff} }
Setting the Environment
To determine your environment, IoC Env
checks the following:
- Environment Variables - if an environment variable named
env
orenvironment
if found, it is taken to be your environment. - Program Arguments - if an option labelled
-env
or-environment
if found, the environment is taken to be the argument following. Example,-env prod
. This convention follows @Opt from util::AbstractMain. - Manual Override - the environment may be set / overridden when the IocEnv instance is created.
The ordering of checks mean program arguments override environment variables and a manual override trumps everything.
Note if no environment setting is found, it defaults to Production
. This is because it's usually easier to configure dev and test boxes than it is to configure production ones. So it is one less thing to worry about!
ALIEN-AID: Because the environment default is
production
you need to set the environment on your dev machine. The easiest way to do this is to set a new environment variable calledENV
to the valuedev
.
Overriding the Environment
Should you need to programmatically override the environment, do it by overriding the IocEnv service in your AppModule
:
using afIoc using afIocEnv const class AppModule { Void defineServices(RegistryBuilder defs) { defs.overrideService(IocEnv#.qname).withCtorArgs(["MoFo"]) } .... }