Table of Contents
Code Example
Example 1: Basic Service registration and resolution
Example 2: Keyed service used in multiple implementations
Conclusion
Home Backend Development Golang Ore: Advanced Dependency Injection Package for Go

Ore: Advanced Dependency Injection Package for Go

Jan 13, 2025 am 08:37 AM

Ore: Advanced Dependency Injection Package for Go

Ore: Advanced dependency injection package for Go language

Ore Documentation Website

GitHub repository

The Go language is known for its simplicity and high performance, but developers often face challenges when it comes to dependency management. Although the Go language does not have a built-in DI framework like some other languages, there are many third-party libraries that can help. Ore is such a package that provides a lightweight and efficient solution for dependency injection (DI) in Go applications.

Ore is designed to simplify and improve DI efficiency without introducing significant performance overhead. Unlike many other DI libraries, Ore utilizes Go Generics instead of reflection or code generation, ensuring your application remains fast and type-safe. This makes Ore ideal for developers looking for an efficient, easy-to-use DI solution. In this article, we will introduce the key features of Ore and how they can help you manage dependencies in Go. We will also show some basic code examples to demonstrate how Ore can be used in real applications.


Ore’s key features

1.

Generic-based dependency injection

Ore utilizes

Go generics

to register and resolve dependencies. This design choice avoids the performance overhead typically associated with reflection and code generation. By using generics, Ore ensures that dependency resolution is type-safe and efficient, without any kind of runtime checking. This approach makes Ore a high-performance DI solution because it avoids the pitfalls of reflection and code generation that are common in many other DI frameworks.

2.

Simple and flexible registration

Ore provides multiple ways to register services, allowing you to flexibly choose according to the life cycle of the service (for example, singleton, scope, transient). Whether you need a single instance, a scoped instance for a specific context, or a transient instance created on every request, Ore has you covered.

3.

Keying Service

Ore allows you to register and resolve multiple implementations of the same interface using a

keyed service

. This feature is useful when you need to manage multiple versions of a service or need to implement different behavior based on certain conditions. For example, you can create multiple implementations of a service for different environments (e.g., test, production) or different configurations (e.g., based on user roles).

4.

Placeholder Service

Ore also supports

Placeholder Services

, allowing you to register services with unresolved dependencies that can be populated at runtime. This feature is useful when some values ​​or services are not available at registration time, but become available later. For example, you can register a service that requires configuration values ​​and then dynamically provide the actual configuration based on context (e.g., user role or environment).

5. Verification

Ore includes built-in Registration Verification that catches common issues such as:

  • Missing dependencies: Make sure all required services are registered.
  • Circular Dependencies: Detect and prevent circular dependency chains.
  • Lifecycle mismatch: Ensure that services with longer lifecycles do not depend on services with shorter lifecycles.

This validation occurs automatically when you use ore.Get or ore.GetList to resolve the service, but you can also trigger validation manually using ore.Validate(). This ensures your dependency graph is correct and avoids runtime errors due to misconfiguration.

Additionally, you can disable validation for performance reasons or seal the container to prevent further modifications after registering all services.

6. High performance

Performance is a key consideration in Ore. By avoiding reflection and code generation, Ore remains fast, even in large applications with complex dependency graphs. Ore's benchmark results demonstrate its efficiency, with certain operations taking just a few nanoseconds to complete. This makes Ore an excellent choice for high-performance Go applications that require efficient DI without additional overhead.

7. Modularization and Scope Containers

Ore supports modular containers, allowing you to define separate containers for different parts of your application. This is particularly useful for modular applications, where different components or modules have different dependencies. You can define scoped containers for different use cases, making your dependency management more organized and easier to maintain.


Code Example

To better understand how Ore works, let’s look at a few simple examples using the default Ore container.

Example 1: Basic Service registration and resolution

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package main

 

import (

    "context"

    "fmt"

    "github.com/firasdarwish/ore"

)

 

// 定义一个接口

type Greeter interface {

    Greet() string

}

 

// 定义一个服务实现

type FriendlyGreeter struct{}

 

func (g *FriendlyGreeter) Greet() string {

    return "Hello, world!"

}

 

func main() {

    // 使用默认Ore容器注册服务

    ore.RegisterFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {

        return &FriendlyGreeter{}, ctx

    })

 

    // 从默认Ore容器解析服务

    greeter, _ := ore.Get[Greeter](context.Background())

    fmt.Println(greeter.Greet()) // 输出:Hello, world!

}

Copy after login

This example demonstrates the registration of a service. Here, we define a Greeter interface and a FriendlyGreeter implementation, register it as a singleton, and then resolve it using the default Ore container.

Example 2: Keyed service used in multiple implementations

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

package main

 

import (

    "context"

    "fmt"

    "github.com/firasdarwish/ore"

)

 

// 定义一个接口

type Greeter interface {

    Greet() string

}

 

// 定义多个实现

type FriendlyGreeter struct{}

 

func (g *FriendlyGreeter) Greet() string {

    return "Hello, friend!"

}

 

type FormalGreeter struct{}

 

func (g *FormalGreeter) Greet() string {

    return "Good day, Sir/Madam."

}

 

func main() {

    // 使用键注册多个实现

    ore.RegisterKeyedFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {

        return &FriendlyGreeter{}, ctx

    }, "friendly")

 

    ore.RegisterKeyedFunc[Greeter](ore.Singleton, func(ctx context.Context) (Greeter, context.Context) {

        return &FormalGreeter{}, ctx

    }, "formal")

 

    // 根据键解析特定实现

    greeter, _ := ore.GetKeyed[Greeter](context.Background(), "friendly")

    fmt.Println(greeter.Greet()) // 输出:Hello, friend!

 

    greeter, _ = ore.GetKeyed[Greeter](context.Background(), "formal")

    fmt.Println(greeter.Greet()) // 输出:Good day, Sir/Madam.

}

Copy after login

In this example, we register two implementations of the Greeter interface with the keys ("friendly" and "formal") and resolve them based on the required keys. This flexibility allows you to easily manage different implementations.


Conclusion

Ore provides a concise, simple and efficient dependency injection solution for Go. By using Go generics, Ore provides fast and type-safe dependency resolution without the performance overhead of reflection. It is flexible and easy to use and includes features such as Keyed Services, Placeholder Services and Validation to ensure your application remains robust.

Ore Documentation Website

GitHub repository

The above is the detailed content of Ore: Advanced Dependency Injection Package for Go. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1657
14
PHP Tutorial
1257
29
C# Tutorial
1230
24
Golang's Purpose: Building Efficient and Scalable Systems Golang's Purpose: Building Efficient and Scalable Systems Apr 09, 2025 pm 05:17 PM

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Golang and C  : Concurrency vs. Raw Speed Golang and C : Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golang is better than C in concurrency, while C is better than Golang in raw speed. 1) Golang achieves efficient concurrency through goroutine and channel, which is suitable for handling a large number of concurrent tasks. 2)C Through compiler optimization and standard library, it provides high performance close to hardware, suitable for applications that require extreme optimization.

Golang vs. Python: Key Differences and Similarities Golang vs. Python: Key Differences and Similarities Apr 17, 2025 am 12:15 AM

Golang and Python each have their own advantages: Golang is suitable for high performance and concurrent programming, while Python is suitable for data science and web development. Golang is known for its concurrency model and efficient performance, while Python is known for its concise syntax and rich library ecosystem.

Golang vs. Python: Performance and Scalability Golang vs. Python: Performance and Scalability Apr 19, 2025 am 12:18 AM

Golang is better than Python in terms of performance and scalability. 1) Golang's compilation-type characteristics and efficient concurrency model make it perform well in high concurrency scenarios. 2) Python, as an interpreted language, executes slowly, but can optimize performance through tools such as Cython.

C   and Golang: When Performance is Crucial C and Golang: When Performance is Crucial Apr 13, 2025 am 12:11 AM

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

The Performance Race: Golang vs. C The Performance Race: Golang vs. C Apr 16, 2025 am 12:07 AM

Golang and C each have their own advantages in performance competitions: 1) Golang is suitable for high concurrency and rapid development, and 2) C provides higher performance and fine-grained control. The selection should be based on project requirements and team technology stack.

Golang's Impact: Speed, Efficiency, and Simplicity Golang's Impact: Speed, Efficiency, and Simplicity Apr 14, 2025 am 12:11 AM

Goimpactsdevelopmentpositivelythroughspeed,efficiency,andsimplicity.1)Speed:Gocompilesquicklyandrunsefficiently,idealforlargeprojects.2)Efficiency:Itscomprehensivestandardlibraryreducesexternaldependencies,enhancingdevelopmentefficiency.3)Simplicity:

Golang and C  : The Trade-offs in Performance Golang and C : The Trade-offs in Performance Apr 17, 2025 am 12:18 AM

The performance differences between Golang and C are mainly reflected in memory management, compilation optimization and runtime efficiency. 1) Golang's garbage collection mechanism is convenient but may affect performance, 2) C's manual memory management and compiler optimization are more efficient in recursive computing.

See all articles