2.0.372 • Published 30 days ago

@spinajs/di v2.0.372

Weekly downloads
14
License
MIT
Repository
github
Last release
30 days ago

Basics

Dependency injection in SpinaJS is done by decorators - ES Next feature supported by Typescript. Lets go straight to example.

Lets say we have class UserController that wants some data from database. It depends on some kind of database object that is used all across application, lets call it Orm. We dont want to hardcode this dependency, neither create new database object every time. We want to get it from DI container that handle it's creation and lifetime.

import { Inject } from "@spinajs/core";
import { Orm } from "service/database";

@Inject(Orm)
class UserController{

    private Database : Orm;

    constructor(database : Orm){

        //  database object is avaible and ready to use
        this.Database = database;
    }
}

In example code above we used special decorator @Inject that tells DI container that class UserController depends on Orm class, and every time UserController is created it must first obtain instance of Orm and pass it to constructor. Notice how constructor signature matches list of dependencies in @Inject decorator. You can also have as many injected dependencies as you need. Here's a quick example:

import { Inject } from "@spinajs/core";
import { Orm } from "service/database";
import { EmailSender } from "service/email";

@Inject(Orm, EmailSender)
class UserController{

    private Database : Orm;
    private Email : EmailSender;

    constructor(database : Orm, email : EmailSender){
        this.Database = database;
        this.Email = email;
    }

    public async registerUser(/** some parameters */){
        await this.Database.insert(/* some data*/);
        await this.Email.sendEmail(/* some data*/);
    }
}

SpinaJS heavily depends on decorators. To use it you must enable "experimentalDecorators" : true" setting to the compilerOptions section of tsconfig.json

Also with typescript having information about types it is possible to skip explicit type declaration and constructor initialization. We can tell DI container to automatically inject dependencies based on variable type. It uses Typescript experimental feature that allows to extract variable type by transpiler. To use it you must set "emitDecoratorMetadata": true" in compilerOptions setion of your tsconfig.json. He's the example:

import { Inject } from "@spinajs/core";
import { Orm } from "service/database";
import { EmailSender } from "service/email";


class UserController{

    @Autoinject
    private Database : Orm;

    @Autoinject
    private Email : EmailSender;

    public async registerUser(/** some parameters */){
        await this.Database.insert(/* some data*/);
        await this.Email.sendEmail(/* some data*/);
    }
}

Notice how we use @Autoinject decorator with class properties and we get rid of constructor and avoid write tedious code. DI container will automaticaly extract property type and resolve it before UserController is created.

Manual resolving

If for some reason you dont want to use DI for heavy work you can resolve instances and their dependencies programmatically. Lets say you have function in some place in your code that is called by external tool or application, like this:

import { DI } from "@spinajs/core";
import { Orm } from "service/database";

async function cleanUserHistory()
{
    const database = await DI.resolve<Orm>(Orm);

    await database.UsersHistory.select().olderThan(5, "days").delete();
}

cleanUserHistory();

We use resolve function of DI container to resolve dependency.

Di container expose more usefull functions for manual usage:

  • has to check if type is already resolved and exists in container
  • get to return resolved object if exists in container, if not returns nothing

Examples below:

import { DI } from "@spinajs/core";
import { Orm } from "service/database";

async function cleanUserHistory()
{
    if(DI.has(Orm)){

        // Orm instance already exists in container, we can obtain it
        const database = DI.get(Orm);
    }
}

cleanUserHistory();

Retreving already created instances

Sometimes we dont want to resolve ( and create new if not exists in container ) instance - just get whats in container or get nothing. Its like optional dependency, if not exists - dont worry, we can ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-++--+--++-+--++-++-

Root container, child containers and DI namespace

Root container is app-wise main DI container that holds all references for resolved objects. It's default container, accessed via DI namespace as shown in previous examples. All we do by methods exposed in the DI namespace use root container.

SpinaJS depencendy injection implementation also have concept of child containers. We can create child containers from main root container that exists in SpinaJS. Child containers are mainly used to overriding DI configuration ( if you want change default services for different implementations or inject mocked objects in tests ). Created child containers inherits all data from parent container.

Object lifetime

Overriding objects

Passing parameters to object contructor

Object factories

Explicit configuration

Resolve strategies

How SpinaJS uses containers

2.0.306

7 months ago

2.0.305

7 months ago

2.0.304

7 months ago

2.0.303

7 months ago

2.0.302

7 months ago

2.0.301

7 months ago

2.0.300

7 months ago

2.0.290

7 months ago

2.0.299

7 months ago

2.0.297

7 months ago

2.0.296

7 months ago

2.0.295

7 months ago

2.0.294

7 months ago

2.0.293

7 months ago

2.0.292

7 months ago

2.0.291

7 months ago

2.0.279

8 months ago

2.0.278

8 months ago

2.0.277

8 months ago

2.0.276

8 months ago

2.0.275

8 months ago

2.0.289

7 months ago

2.0.288

7 months ago

2.0.286

7 months ago

2.0.285

7 months ago

2.0.284

7 months ago

2.0.283

7 months ago

2.0.282

7 months ago

2.0.281

7 months ago

2.0.280

7 months ago

2.0.372

30 days ago

2.0.371

1 month ago

2.0.370

1 month ago

2.0.359

2 months ago

2.0.358

2 months ago

2.0.357

2 months ago

2.0.356

2 months ago

2.0.355

2 months ago

2.0.354

2 months ago

2.0.353

3 months ago

2.0.352

3 months ago

2.0.351

3 months ago

2.0.350

3 months ago

2.0.369

1 month ago

2.0.368

1 month ago

2.0.367

1 month ago

2.0.363

2 months ago

2.0.362

2 months ago

2.0.361

2 months ago

2.0.360

2 months ago

2.0.329

3 months ago

2.0.339

3 months ago

2.0.338

3 months ago

2.0.337

3 months ago

2.0.335

3 months ago

2.0.334

3 months ago

2.0.333

3 months ago

2.0.332

3 months ago

2.0.331

3 months ago

2.0.330

3 months ago

2.0.349

3 months ago

2.0.348

3 months ago

2.0.347

3 months ago

2.0.346

3 months ago

2.0.345

3 months ago

2.0.344

3 months ago

2.0.343

3 months ago

2.0.342

3 months ago

2.0.340

3 months ago

2.0.309

7 months ago

2.0.308

7 months ago

2.0.317

4 months ago

2.0.316

5 months ago

2.0.315

5 months ago

2.0.314

6 months ago

2.0.313

6 months ago

2.0.312

7 months ago

2.0.311

7 months ago

2.0.310

7 months ago

2.0.319

4 months ago

2.0.318

4 months ago

2.0.328

3 months ago

2.0.327

4 months ago

2.0.325

4 months ago

2.0.324

4 months ago

2.0.323

4 months ago

2.0.322

4 months ago

2.0.321

4 months ago

2.0.320

4 months ago

2.0.274

9 months ago

2.0.273

9 months ago

2.0.272

9 months ago

2.0.271

9 months ago

2.0.270

9 months ago

2.0.269

9 months ago

2.0.268

9 months ago

2.0.267

9 months ago

2.0.266

9 months ago

2.0.265

9 months ago

2.0.264

9 months ago

2.0.191

1 year ago

2.0.190

1 year ago

2.0.199

1 year ago

2.0.198

1 year ago

2.0.197

1 year ago

2.0.196

1 year ago

2.0.195

1 year ago

2.0.194

1 year ago

2.0.193

1 year ago

2.0.192

1 year ago

2.0.189

1 year ago

2.0.188

1 year ago

2.0.187

1 year ago

2.0.186

1 year ago

2.0.259

10 months ago

2.0.258

10 months ago

2.0.257

10 months ago

2.0.256

10 months ago

2.0.255

10 months ago

2.0.254

10 months ago

2.0.253

10 months ago

2.0.252

10 months ago

2.0.251

10 months ago

2.0.250

10 months ago

2.0.263

10 months ago

2.0.262

10 months ago

2.0.261

10 months ago

2.0.260

10 months ago

2.0.238

10 months ago

2.0.237

10 months ago

2.0.236

10 months ago

2.0.235

10 months ago

2.0.234

10 months ago

2.0.233

10 months ago

2.0.232

10 months ago

2.0.231

11 months ago

2.0.230

11 months ago

2.0.249

10 months ago

2.0.248

10 months ago

2.0.247

10 months ago

2.0.246

10 months ago

2.0.245

10 months ago

2.0.244

10 months ago

2.0.243

10 months ago

2.0.242

10 months ago

2.0.241

10 months ago

2.0.240

10 months ago

2.0.209

1 year ago

2.0.208

1 year ago

2.0.218

12 months ago

2.0.217

1 year ago

2.0.216

1 year ago

2.0.215

1 year ago

2.0.214

1 year ago

2.0.213

1 year ago

2.0.212

1 year ago

2.0.211

1 year ago

2.0.210

1 year ago

2.0.219

12 months ago

2.0.229

12 months ago

2.0.228

12 months ago

2.0.227

12 months ago

2.0.226

12 months ago

2.0.225

12 months ago

2.0.224

12 months ago

2.0.223

12 months ago

2.0.222

12 months ago

2.0.221

12 months ago

2.0.220

12 months ago

2.0.207

1 year ago

2.0.206

1 year ago

2.0.205

1 year ago

2.0.204

1 year ago

2.0.203

1 year ago

2.0.202

1 year ago

2.0.201

1 year ago

2.0.200

1 year ago

2.0.185

1 year ago

2.0.184

1 year ago

2.0.183

1 year ago

2.0.182

1 year ago

2.0.181

1 year ago

2.0.179

2 years ago

2.0.178

2 years ago

2.0.177

2 years ago

2.0.176

2 years ago

2.0.175

2 years ago

2.0.174

2 years ago

2.0.173

2 years ago

2.0.172

2 years ago

2.0.171

2 years ago

2.0.170

2 years ago

2.0.180

2 years ago

2.0.169

2 years ago

2.0.168

2 years ago

2.0.167

2 years ago

2.0.166

2 years ago

2.0.164

2 years ago

2.0.163

2 years ago

2.0.162

2 years ago

2.0.161

2 years ago

2.0.139

2 years ago

2.0.138

2 years ago

2.0.137

2 years ago

2.0.136

2 years ago

2.0.135

2 years ago

2.0.134

2 years ago

2.0.133

2 years ago

2.0.149

2 years ago

2.0.148

2 years ago

2.0.147

2 years ago

2.0.146

2 years ago

2.0.145

2 years ago

2.0.144

2 years ago

2.0.143

2 years ago

2.0.142

2 years ago

2.0.141

2 years ago

2.0.140

2 years ago

2.0.159

2 years ago

2.0.158

2 years ago

2.0.157

2 years ago

2.0.156

2 years ago

2.0.155

2 years ago

2.0.154

2 years ago

2.0.153

2 years ago

2.0.152

2 years ago

2.0.151

2 years ago

2.0.150

2 years ago

2.0.160

2 years ago

2.0.132

2 years ago

2.0.131

2 years ago

2.0.130

2 years ago

2.0.129

2 years ago

2.0.128

2 years ago

2.0.127

2 years ago

2.0.126

2 years ago

2.0.124

2 years ago

2.0.123

2 years ago

2.0.122

2 years ago

2.0.119

2 years ago

2.0.118

2 years ago

2.0.121

2 years ago

2.0.120

2 years ago

2.0.117

2 years ago

2.0.116

2 years ago

2.0.109

2 years ago

2.0.115

2 years ago

2.0.114

2 years ago

2.0.113

2 years ago

2.0.112

2 years ago

2.0.111

2 years ago

2.0.110

2 years ago

2.0.68

2 years ago

2.0.69

2 years ago

2.0.67

2 years ago

2.0.79

2 years ago

2.0.77

2 years ago

2.0.78

2 years ago

2.0.75

2 years ago

2.0.76

2 years ago

2.0.73

2 years ago

2.0.74

2 years ago

2.0.71

2 years ago

2.0.70

2 years ago

2.0.107

2 years ago

2.0.106

2 years ago

2.0.105

2 years ago

2.0.104

2 years ago

2.0.88

2 years ago

2.0.103

2 years ago

2.0.89

2 years ago

2.0.102

2 years ago

2.0.86

2 years ago

2.0.101

2 years ago

2.0.87

2 years ago

2.0.100

2 years ago

2.0.84

2 years ago

2.0.85

2 years ago

2.0.82

2 years ago

2.0.83

2 years ago

2.0.80

2 years ago

2.0.81

2 years ago

2.0.99

2 years ago

2.0.98

2 years ago

2.0.95

2 years ago

2.0.96

2 years ago

2.0.93

2 years ago

2.0.94

2 years ago

2.0.91

2 years ago

2.0.92

2 years ago

2.0.90

2 years ago

2.0.39

2 years ago

2.0.48

2 years ago

2.0.49

2 years ago

2.0.46

2 years ago

2.0.44

2 years ago

2.0.45

2 years ago

2.0.59

2 years ago

2.0.57

2 years ago

2.0.58

2 years ago

2.0.55

2 years ago

2.0.56

2 years ago

2.0.53

2 years ago

2.0.54

2 years ago

2.0.51

2 years ago

2.0.52

2 years ago

2.0.50

2 years ago

2.0.66

2 years ago

2.0.64

2 years ago

2.0.65

2 years ago

2.0.62

2 years ago

2.0.63

2 years ago

2.0.60

2 years ago

2.0.61

2 years ago

2.0.38

3 years ago

1.2.211

3 years ago

2.0.12

3 years ago

1.2.208

3 years ago

1.2.127

3 years ago

2.0.19

3 years ago

1.2.81

3 years ago

1.2.79

3 years ago

1.2.19

3 years ago

1.2.7

3 years ago

1.1.7

3 years ago

1.1.5

3 years ago

1.2.20

3 years ago

1.2.68

3 years ago

1.2.26

3 years ago

1.2.30

3 years ago

1.2.12

3 years ago

1.2.32

3 years ago

1.0.19

5 years ago

1.0.18

5 years ago

1.0.17

5 years ago

1.0.16

5 years ago

1.0.12

5 years ago

1.0.11

6 years ago

1.0.7

6 years ago

1.0.5

6 years ago

1.0.4

6 years ago

1.0.3

6 years ago

1.0.2

6 years ago

1.0.1

6 years ago

1.0.0

6 years ago