Injectfy

πŸš€ A minimalistic and easy-to-use dependency injection library for managing singletons and factories in Dart.

🌟 Features

  • βœ… Register singletons and factories to manage dependencies.
  • πŸ”„ Automatically resolve and inject dependencies.
  • ❌ Easily unregister dependencies.
  • ⚑ Cache frequently accessed instances for better performance.
  • πŸ› οΈ Useful for both production and testing (with mock support).

πŸ“¦ Installation

Add the following dependency to your pubspec.yaml:

dependencies:
  injectfy: ^1.0.1

Then, run:

flutter pub get

πŸš€ Getting Started

πŸ“‹ Basic Usage

import 'package:injectfy/injectfy.dart';

void main() {
  // Get instance
  final injectfy = Injectfy.instance;

  // Registering a singleton
  injectfy.registerSingleton<SomeService>(() => SomeService());

  // Registering a factory
  injectfy.registerFactory<ClientsRepository>(() => ClientsRepositoryImpl());

  // Resolving dependencies
  final someService = injectfy.get<SomeService>();
  final clientsRepository = injectfy.get<ClientsRepository>();

  print(someService);  // Instance of SomeService
  print(clientsRepository);  // Instance of ClientsRepositoryImpl
}

🧱 Registering a Singleton

A singleton will be instantiated only once and reused every time it's requested.

class SomeService {
  void doSomething() => print("Doing something...");
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  final service1 = Injectfy.get<SomeService>();
  final service2 = Injectfy.get<SomeService>();

  print(identical(service1, service2));  // Output: true
}

🏒 Registering a Factory

A factory allows creating a new instance of the dependency every time it is requested.

class UserRepository {}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerFactory<UserRepository>(() => UserRepository());

  final repo1 = Injectfy.get<UserRepository>();
  final repo2 = Injectfy.get<UserRepository>();

  print(identical(repo1, repo2));  // Output: false
}

🧐 Automatically Resolving Dependencies

You can automatically resolve dependencies when calling a method.

class SomeService {
  final SomeDependency _someDependency;

  SomeService(this._someDependency);
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService(injectfy()));
}

πŸ› οΈ Unregistering a Dependency

You can unregister a previously registered dependency if it's no longer needed.

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  injectfy.unregister<SomeService>();

  try {
    final service = Injectfy.get<SomeService>();
  } catch (e) {
    print(e);  // Dependency of type SomeService not found.
  }
}

πŸ§ͺ Registering Mock Dependencies (Useful for Testing)

For testing purposes, you can register mock objects in place of actual dependencies.

void main() {
  final injectfy = Injectfy.instance;

  final mockService = SomeService();
  injectfy.registerMock<SomeService>(mockService);

  final service = Injectfy.get<SomeService>();
  print(service == mockService);  // Output: true
}

πŸ–‹οΈ API Reference

πŸ› οΈ Injectfy

Method Description
instance Get a singleton instance of Injectfy.
I Short syntax to get the instance.
registerSingleton<T> Registers a singleton for the specified type T.
registerFactory<T> Registers a factory for the specified type T.
get<T> Resolves and returns the instance of type T.
call<T> Automatically resolves and returns the instance of type T.
unregister<T> Unregisters the dependency of type T.
registerMock<T> Registers a mock object in place of a real dependency. Useful for testing.

πŸ§ͺ Testing

You can test your application by registering mock dependencies for testing purposes.

Example of Testing with Mocks

import 'package:test/test.dart';

void main() {
  test('Singleton works correctly', () {
    Injectfy.I.registerSingleton<SomeService>(() => SomeService());

    final service1 = Injectfy.get<SomeService>();
    final service2 = Injectfy.get<SomeService>();

    expect(identical(service1, service2), true);
  });

  test('Factory works correctly', () {
    Injectfy.I.registerFactory<UserRepository>(() => UserRepository());

    final repo1 = Injectfy.get<UserRepository>();
    final repo2 = Injectfy.get<UserRepository>();

    expect(identical(repo1, repo2), false);
  });

  test('Mock registration works correctly', () {
    final mockService = SomeService();
    Injectfy.I.registerMock<SomeService>(mockService);

    final service = Injectfy.get<SomeService>();

    expect(service, mockService);
  });
}

🧱 Contributing

Contributions are welcome! Please open issues or submit pull requests on the GitHub repository.

πŸ“„ License

This library is licensed under the MIT License. See the LICENSE file for details.

πŸš€ Injectfy: A Simple Dependency Injection Library for Dart

A minimalistic and easy-to-use dependency injection library for managing singletons and factories in Dart.

🌟 Features

  • βœ… Register singletons and factories to manage dependencies.
  • πŸ”„ Automatically resolve and inject dependencies.
  • ❌ Easily unregister dependencies.
  • ⚑ Cache frequently accessed instances for better performance.
  • πŸ› οΈ Useful for both production and testing (with mock support).

πŸ“¦ Installation

Add the following dependency to your pubspec.yaml:

dependencies:
  injectfy: ^1.0.0

Then, run:

flutter pub get

πŸš€ Getting Started

πŸ“‹ Basic Usage

import 'package:injectfy/injectfy.dart';

void main() {
  // Get instance
  final injectfy = Injectfy.instance;

  // Registering a singleton
  injectfy.registerSingleton<SomeService>(() => SomeService());

  // Registering a factory
  injectfy.registerFactory<ClientsRepository>(() => ClientsRepositoryImpl());

  // Resolving dependencies
  final someService = injectfy.get<SomeService>();
  final clientsRepository = injectfy.get<ClientsRepository>();

  print(someService);  // Instance of SomeService
  print(clientsRepository);  // Instance of ClientsRepositoryImpl
}

🧱 Registering a Singleton

A singleton will be instantiated only once and reused every time it's requested.

class SomeService {
  void doSomething() => print("Doing something...");
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  final service1 = Injectfy.get<SomeService>();
  final service2 = Injectfy.get<SomeService>();

  print(identical(service1, service2));  // Output: true
}

🏒 Registering a Factory

A factory allows creating a new instance of the dependency every time it is requested.

class UserRepository {}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerFactory<UserRepository>(() => UserRepository());

  final repo1 = Injectfy.get<UserRepository>();
  final repo2 = Injectfy.get<UserRepository>();

  print(identical(repo1, repo2));  // Output: false
}

🧐 Automatically Resolving Dependencies

You can automatically resolve dependencies when calling a method.

class SomeService {
  final SomeDependency _someDependency;

  SomeService(this._someDependency);
}

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService(injectfy()));
}

πŸ› οΈ Unregistering a Dependency

You can unregister a previously registered dependency if it's no longer needed.

void main() {
  final injectfy = Injectfy.instance;

  injectfy.registerSingleton<SomeService>(() => SomeService());

  injectfy.unregister<SomeService>();

  try {
    final service = Injectfy.get<SomeService>();
  } catch (e) {
    print(e);  // Dependency of type SomeService not found.
  }
}

πŸ§ͺ Registering Mock Dependencies (Useful for Testing)

For testing purposes, you can register mock objects in place of actual dependencies.

void main() {
  final injectfy = Injectfy.instance;

  final mockService = SomeService();
  injectfy.registerMock<SomeService>(mockService);

  final service = Injectfy.get<SomeService>();
  print(service == mockService);  // Output: true
}

πŸ–‹οΈ API Reference

πŸ› οΈ Injectfy

Method Description
instance Get a singleton instance of Injectfy.
I Short syntax to get the instance.
registerSingleton<T> Registers a singleton for the specified type T.
registerFactory<T> Registers a factory for the specified type T.
get<T> Resolves and returns the instance of type T.
call<T> Automatically resolves and returns the instance of type T.
unregister<T> Unregisters the dependency of type T.
registerMock<T> Registers a mock object in place of a real dependency. Useful for testing.

πŸ§ͺ Testing

You can test your application by registering mock dependencies for testing purposes.

Example of Testing with Mocks

import 'package:test/test.dart';

void main() {
  test('Singleton works correctly', () {
    Injectfy.I.registerSingleton<SomeService>(() => SomeService());

    final service1 = Injectfy.get<SomeService>();
    final service2 = Injectfy.get<SomeService>();

    expect(identical(service1, service2), true);
  });

  test('Factory works correctly', () {
    Injectfy.I.registerFactory<UserRepository>(() => UserRepository());

    final repo1 = Injectfy.get<UserRepository>();
    final repo2 = Injectfy.get<UserRepository>();

    expect(identical(repo1, repo2), false);
  });

  test('Mock registration works correctly', () {
    final mockService = SomeService();
    Injectfy.I.registerMock<SomeService>(mockService);

    final service = Injectfy.get<SomeService>();

    expect(service, mockService);
  });
}

🧱 Contributing

Contributions are welcome! Please open issues or submit pull requests on the GitHub repository.

πŸ“„ License

This library is licensed under the MIT License. See the LICENSE file for details.


Made with ❀️ for Flutter developers! 🎯

Libraries

injectfy