Dependency Injection and IoC Container Usage

Dependency Injection and IoC Container Usage 10218 This blog post delves into the concept of Dependency Injection (DI), a key design principle in software development. It explains what DI is, its fundamental concepts, and the benefits of IoC containers. It covers different DI methods, the implementation process, and considerations for using IoC containers. It also explains how to increase testability with DI and introduces useful tools and libraries. It summarizes the benefits of DI in software projects by evaluating the advantages of using DI in code, common pitfalls, and its impact on processing power. The goal is to help readers understand Dependency Injection and correctly implement it in their projects.

This blog post delves into the concept of Dependency Injection (DI), a key design principle in software development. It explains what DI is, its core concepts, and the benefits of IoC containers. It covers different DI methods, the implementation process, and considerations for using IoC containers. It also explains how to increase testability with DI and introduces useful tools and libraries. It summarizes the benefits of DI in software projects by evaluating the advantages of using DI in code, common pitfalls, and its impact on processing power. The goal is to help readers understand Dependency Injection and correctly implement it in their projects.

What is Dependency Injection? Let's Understand the Basic Concepts

Dependency Injection (DI)It's a design pattern that allows a class to inherit the dependencies it needs. In traditional programming, a class creates or finds its own dependencies. However, with DI, this responsibility is outsourced, making classes more flexible, reusable, and testable. This approach allows for a more modular structure by reducing dependencies between different layers of the application.

To understand the DI principle, first dependency It's important to clarify the concept. If a class needs another class or object, that needed class or object is a dependency of that class. For example, if a ReportingService class needs a DatabaseConnection class, the DatabaseConnection is a dependency of that ReportingService class. Here's how this dependency is provided to the ReportingService class. Dependency InjectionIt forms the basis of .

Concept Explanation Importance
Dependency Other classes or objects that a class requires to function. It is necessary for the proper functioning of classes.
Injection The process of providing dependencies to a class from outside. It allows classes to be more flexible and testable.
IoC Container A tool that automatically manages and injects dependencies. It simplifies dependency management across the application.
Constructor Injection Injecting dependencies through the constructor method of the class. It is preferred in cases where dependencies are mandatory.

Dependency Injection Thanks to this, classes can focus solely on using their dependencies rather than worrying about how to obtain them. This makes for cleaner and more understandable code. Furthermore, externalizing dependencies simplifies unit testing because they can be easily replaced with mock objects. This allows for testing the class's behavior in isolation.

Key Benefits of Dependency Injection:

  • Loose Coupling: Dependencies between classes are reduced, making changes in the system less likely to affect other parts.
  • Reusability: Classes that inherit dependencies can be more easily reused across different environments and scenarios.
  • Testability: Unit testing is simplified by replacing dependencies with mock objects.
  • Sustainability: The more modular and understandable the code, the lower the maintenance costs.
  • Development Speed: Easily managing and testing dependencies speeds up the development process.

Dependency InjectionIt's a powerful design principle that plays a crucial role in modern software development processes, enabling the creation of flexible, testable, and maintainable applications. Understanding and correctly applying this principle is critical to the success of software projects.

What is an IoC Container and What Does It Do?

Dependency Injection When implementing DI principles, manually managing object dependencies can be complex and time-consuming. This is where the IoC (Inversion of Control) container comes in. By automating the processes of creating, managing, and injecting objects with their dependencies, IoC containers significantly simplify the work of developers. In essence, they act as the orchestrator of the objects in your application.

Feature Explanation Benefits
Dependency Management It automatically resolves and injects dependencies of objects. It makes the code more modular, testable and reusable.
Life Cycle Management It manages the processes of creating, using, and destroying objects. It ensures efficient use of resources and prevents memory leaks.
Configuration Stores configuration information on how to resolve dependencies. It offers the flexibility to change dependencies without making changes to the code.
AOP Integration It integrates with Aspect-Oriented Programming (AOP) to enable centralized management of cross-cutting concerns. It allows easy implementation of application-wide behaviors (logging, security, etc.).

IoC containers provide a structure that defines how objects in your application interact with each other. By using this structure, you reduce tight coupling between objects and encourage loose coupling. This makes your code more flexible, maintainable, and testable. Below are the steps to using an IoC container:

    Stages of IoC Container Usage:

  1. Starting and configuring the container.
  2. Registering services (dependencies) in the container.
  3. Requesting objects from the container.
  4. The container automatically resolves and injects dependencies.
  5. Use of objects.
  6. Container releases resources (optional).

IoC Container, Dependency Injection It's a powerful tool that simplifies the application of code principles and makes your application more maintainable. With this tool, you can reduce the complexity of your code, increase testability, and create a more flexible architecture.

Using an IoC container speeds up the development process and reduces the likelihood of errors. For example, popular IoC containers like ApplicationContext in the Spring Framework or Autofac in .NET offer a wide range of features, providing significant convenience for developers. These containers make it much easier to manage object lifecycles, inject dependencies, and implement advanced techniques like AOP.

Dependency Injection Methods and Application Process

Dependency Injection (DI) is a design pattern that allows a class to inject its dependencies externally. This makes classes more flexible, reusable, and testable. How dependencies are injected can be accomplished in different ways, depending on the architecture and complexity of the application. In this section, we'll cover the most common Dependency Injection methods and application processes will be examined.

Different Dependency Injection Methods:

  • Constructor Injection
  • Setter Injection
  • Interface Injection
  • Method Injection
  • Service Locator Pattern (Often Compared to DI)

The table below provides a comparative analysis of different injection methods. This table will help you understand the advantages, disadvantages, and typical usage scenarios of each method.

Method Advantages Disadvantages Usage Scenarios
Constructor Injection Dependencies are mandatory, provide immutability, and ease of testing. Complex constructor methods in case of too many dependencies. Cases where there are mandatory dependencies and do not change throughout the object's life cycle.
Setter Injection Optional dependencies, flexibility. Possibility of missing dependencies, risk of the object going into an inconsistent state. Cases where there are optional dependencies and the state of the object can be set later.
Interface Injection Loose coupling, easy interchangeability of different implementations. May require more interface definitions, increasing complexity. Situations where different modules need to communicate with each other flexibly.
Method Injection Cases where dependencies are required only for certain methods. Managing dependencies can be more complex. There are dependencies that are only required for certain operations.

Each of these methods can offer advantages in different scenarios. Choosing the most appropriate method depends on the application's requirements and design goals. Let's take a closer look at two of the most commonly used methods.

Method 1: Constructor Injection

Constructor Injection is a method in which the dependencies of a class are injected through the constructor method of the class. This method compulsory It is particularly useful when there are dependencies. Obtaining dependencies through the constructor method ensures that the class always has the dependencies it needs.

Method 2: Setter Injection

Setter Injection is a method in which the dependencies of a class are injected through set methods. This method optional It is useful when the dependencies are present or can be changed later. Set methods allow flexible adjustment of dependencies.

Dependency Injection Correctly implementing these methods is critical to the application's maintainability and testability. The chosen method should be compatible with the project's overall architecture and facilitate the development process.

Things to Consider When Using IoC Containers

IoC (Inversion of Control) containers, Dependency Injection They are powerful tools for implementing and managing IoC principles. However, using these tools correctly and effectively is critical to the overall health and sustainability of the application. Misuse can lead to performance issues, complexity, and even errors. Therefore, there are some important points to consider when using IoC containers.

Area to be Considered Explanation Recommended Approach
Life Cycle Management The processes by which objects are created, used, and destroyed. Ensure that the container manages the object lifecycle correctly.
Dependency Resolution Correct and timely resolution of dependencies. Avoid circular dependencies and define dependencies clearly.
Performance Optimization The performance of the container can affect the overall speed of the application. Avoid creating unnecessary objects and consider lifecycle options like singletons.
Error Management Handling errors that may occur during dependency resolution. Capture error conditions and provide meaningful error messages.

One of the common mistakes when using IoC containers is to try to manage every object by the container. Using containers for objects such as simple objects or data containers (DTOs) can lead to unnecessary complexity. Creating such objects directly with the new operator can be simpler and more performant. A more appropriate approach would be to use containers only for objects with complex dependencies and requiring lifecycle management.

Main Points to Note:

  • Scope Selection: It is important to choose the appropriate scope (singleton, transient, scoped, etc.) to manage the lifecycle of objects correctly.
  • Clearly Defining Dependencies: Clearly declaring dependencies to the container prevents incorrect resolutions.
  • Preventing Circular Dependencies: Circular dependencies like A -> B and B -> A can prevent the container from working correctly.
  • Performance Monitoring: The performance of a container can impact the overall performance of the application. It's important to monitor and optimize performance regularly.
  • Error Management: Catching and appropriately handling errors that may occur during dependency resolution increases the stability of the application.
  • Avoiding Overuse: Trying to manage every object with a container can lead to unnecessary complexity. A better approach is to use containers only when necessary.

Another important point is to configure the IoC container correctly. Incorrect configurations can lead to unexpected behavior and errors. It's important to carefully review and verify configuration files (XML, JSON, YAML, etc.) or code-based configurations. Additionally, testing configuration changes in the test environmentcan help prevent problems that may occur in the production environment.

It's important to consider testability when using an IoC container. The advantages of a container make it easier to write unit tests and mock dependencies. However, the container itself should also be tested. It's helpful to write integration tests to ensure the container is configured correctly and resolves dependencies correctly. This ensures the container works seamlessly with other parts of the application.

Methods for Increasing Testability with Dependency Injection

Dependency Injection DI is a powerful tool for improving testability in software projects. By injecting dependencies externally, we can replace real dependencies with mock objects during unit tests. This allows us to isolate the class we want to test and verify only its behavior. Using DI makes our code more modular, flexible, and reusable, significantly simplifying testing.

To better understand how DI improves testability, we can examine different DI implementation approaches and their impact on test cases. For example, using constructor injection forces dependencies to be specified during class creation, preventing them from being missing or misconfigured. Furthermore, by adopting interface-based programming principles, we can define dependencies through interfaces rather than concrete classes. This allows for the easy use of mock objects during testing.

DI Method Testability Advantages Sample Scenario
Constructor Injection Explicit specification of dependencies, easy mocking Testing a service class by injecting a database connection
Setter Injection Optional dependencies can be adjusted during testing Testing a reporting service with different logging mechanisms
Interface Injection Loose coupling, easy use of mock objects Testing a payment system with different payment providers
Service Locator Managing dependencies from a central location Testing common services used in different parts of the application

Integrating DI into testing processes increases test reliability and coverage. For example, suppose we want to test a class that handles payment transactions in an e-commerce application. If this class depends directly on a payment service, we might have to perform a real payment transaction during testing or configure the test environment in a complex way. However, if we inject the payment service dependency using DI, we can replace this service with a mock object during testing and simply verify that the class sends the correct parameters to the payment service.

    Steps to Increase Testability:

  1. Identify Dependencies: Identify what external resources or services your classes need.
  2. Define Interfaces: Abstract your dependencies through interfaces.
  3. Use Constructor Injection: Inject dependencies into the constructor method of the class.
  4. Create Mock Objects: Create mock objects to represent real dependencies during testing.
  5. Write Unit Tests: Test the behavior of each class in isolation.
  6. Increase Test Coverage: Increase the reliability of your code by writing tests that cover all scenarios.

Dependency InjectionIt's an essential method for improving testability in software projects. With DI, we can make our code more modular, flexible, and testable. This means fewer bugs, faster development, and more reliable applications during the software development process. Proper implementation of DI significantly contributes to project success in the long run.

Useful Dependency Injection Tools and Libraries

Dependency Injection Applying DI principles and using IoC containers makes your projects more manageable, testable, and extensible. Numerous tools and libraries have been developed for various programming languages and frameworks. These tools greatly simplify dependency management, injection, and lifecycle management for developers. By choosing the one that best suits your project's needs and the technology you use, you can optimize your development process.

The table below shows popular languages and frameworks Dependency Injection An overview of the tools and libraries is provided. These tools typically allow for the definition and management of dependencies through configuration files or attributes. They also support features such as automatic dependency resolution and singleton or transient lifecycles.

Library/Tool Name Programming Language/Framework Key Features
Spring Framework Java Comprehensive DI support, AOP, transaction management
Dagger Java/Android Compile-time DI, performance-oriented
Autofac .NET Automatic feature injection, modules
Ninject .NET Lightweight, extensible
InversifyJS TypeScript/JavaScript Type-safe DI, decorators
Angular DI TypeScript/Angular Hierarchical injection, providers
Symfony DI Container PHP YAML/XML configuration, service locator

These tools and libraries, Dependency Injection It will guide you in applying its principles and reduce your workload. Each has its own advantages and disadvantages. Therefore, it's important to carefully evaluate your project's needs and choose the most appropriate one. When making your selection, you should also consider factors such as the library's community support, documentation, and up-to-dateness.

Featured Dependency Injection Libraries:

  • Spring Framework (Java): It is one of the most widely used DI containers in the Java ecosystem.
  • Dagger (Java/Android): It is a compile-time DI solution that prioritizes performance, especially in Android projects.
  • Autofac (.NET): It is a DI container with extensive features that is frequently preferred in .NET projects.
  • Ninject (.NET): It is known for its light structure and flexibility.
  • InversifyJS (TypeScript/JavaScript): It is used to provide type-safe DI in TypeScript projects.
  • Angular DI (TypeScript/Angular): It is a DI system that supports hierarchical injection and comes with the Angular framework.
  • Symfony DI Container (PHP): It is a configuration-oriented DI container widely used in PHP projects.

Each of these libraries, Dependency Injection It allows you to implement and manage concepts in different ways. For example, Spring Framework and Symfony DI Container work primarily with configuration files, while Dagger and InversifyJS offer more code-based solutions. When making your selection, you can make the most appropriate decision by considering factors such as your team's experience, the complexity of your project, and performance requirements.

Advantages of Using Dependency Injection

Dependency Injection (DI)It's a design principle frequently used in software projects and offers many advantages. These advantages significantly improve the software development process by making code more modular, testable, and maintainable. Injecting dependencies externally reduces the responsibilities of a class and creates a more flexible structure.

One of the most important benefits of using DI is, loose coupling By reducing dependencies between classes, changing or updating one class doesn't affect other classes. This means fewer errors and easier maintenance throughout the system. Furthermore, different dependencies can be easily modified, making it easier to adapt the application to different environments or needs.

Advantage Explanation Use
Loose Cohesion Reducing dependencies between classes. The code is more modular and flexible.
Testability Dependencies can be replaced with mock objects. Unit tests can be written easily.
Reusability Classes can be reused in different projects. Reducing development time.
Sustainability The code is easier to understand and maintain. Long-term project success.

Summary of Benefits:

  1. Increased Testability: Dependencies can be replaced with mock objects, making unit testing easier.
  2. Improved Modularity: Code is broken down into smaller, independent pieces, which increases reusability.
  3. Reduced Commitment: Dependencies between classes are reduced, making the code more flexible and adaptable.
  4. Simplified Maintenance: Having a clearer and more organized code reduces maintenance costs.
  5. Improved Code Quality: Cleaner, more readable code reduces errors and facilitates collaboration.

Dependency Injection Using it increases the readability and understandability of code. Clearly defining dependencies makes it easier to understand what the code does and how it works. This allows new developers to adapt to the project more quickly and creates a better collaborative environment within the team. All of these benefits Dependency Injectionmakes it an indispensable tool in modern software development projects.

Common Mistakes When Using Dependency Injection

Dependency Injection (DI)is a design pattern frequently used in modern software development. However, some common mistakes when using this powerful technique can degrade application performance, make maintenance difficult, and lead to unexpected errors. Being aware of and avoiding these mistakes can help. DIIt is critical to maximize the benefits of .

DIIncorrect use of often results in complex and difficult-to-understand code. For example, unnecessarily tight coupling of dependencies reduces module reusability and complicates testing processes. This can lead to serious problems, especially in large projects. DI Its application makes the code more modular, flexible and testable.

In the table below, Dependency Injection Common errors encountered in its use and the possible consequences of these errors are summarized:

Mistake Explanation Possible Results
Extreme Dependency Injection Injecting everything unnecessarily as a dependency. Performance degradation, complex code structure.
Wrong Lifecycle Management Failure to properly manage the life cycles of dependencies. Memory leaks, unexpected behavior.
Neglecting Interface Use Injecting dependencies directly into concrete classes. Loss of flexibility, testability issues.
DI Container Overuse For every small transaction DI using containers. Performance issues, unnecessary complexity.

DI Another important point to consider when using dependencies is proper dependency lifecycle management. Improper dependency lifecycle management can lead to memory leaks and application instability. Therefore, it's important to carefully plan when to create, use, and destroy dependencies. Furthermore, neglecting interfaces reduces code flexibility and complicates testing. Directly injecting dependencies into concrete classes reduces module reusability and negatively impacts the overall application architecture.

Mistakes to Avoid:

  1. Avoid Over-Injection of Dependency: Inject only dependencies that are actually needed.
  2. Proper Lifecycle Management: Carefully plan and manage the lifecycles of dependencies.
  3. Don't Neglect the Use of Interface: Stick to interfaces rather than concrete classes.
  4. Use DI Container as Needed: For each transaction DI Instead of using containers, consider simpler solutions.
  5. Avoid Addiction Cycles: Avoid creating classes that depend on each other directly or indirectly.
  6. Choose Composition: Write more flexible and testable code by using composition instead of inheritance.

DI Excessive usage of containers can also negatively impact performance. For every small operation DI Instead of using containers, it's important to consider simpler and more direct solutions. It's important to remember that: DI It's a tool and may not be the right solution for every problem. While this technique offers significant benefits when used correctly, it must be applied carefully and consciously.

Dependency Injection and IoC's Impact on Computing Power

Dependency Injection (DI) The benefits of Inversion of Control (IoC) and Inversion of Control (IoC) principles in software projects are undeniable. However, the impact of these approaches on processing power and performance, especially in large and complex applications, should not be overlooked. DI and IoC containers automate the creation and management of objects, speeding up development and enabling more modular code. However, this automation comes at a cost: runtime overhead and potential performance issues.

To understand the performance impact of DI and IoC containers, it's important to first examine how these structures work and where they might incur additional costs. Automatically injecting object dependencies may require the use of dynamic mechanisms like reflection. Reflection provides access to object properties and methods by examining type information at runtime. However, this process is slower than executing statically typed code and creates additional processor overhead. Additionally, initializing and configuring IoC containers can be time-consuming, especially if the container has numerous objects and dependencies defined.

Factor Explanation Possible Effects
Use of Reflection Dynamic type inspection when injecting dependencies. Increased processor load, decreased performance.
Container Launch Time The time it takes to configure and start the IoC container. Delay in application startup time.
Object Lifecycle Management Creating, using, and destroying container-managed objects. Increased memory usage, increased concentration of garbage collection processes.
AOP Integration Using Aspect-Oriented Programming (AOP) together with DI. Overhead on method calls, performance bottlenecks.

There are several points to consider to minimize performance issues. First, it's important to optimize the configuration of the IoC container. Avoid defining unnecessary dependencies and keep the container as lightweight as possible. Additionally, pre-compiled dependency injection techniques can be used to mitigate the use of reflection. These techniques eliminate the overhead introduced by reflection by ensuring that dependencies are determined at compile time rather than runtime.

    Performance Effects:

  • Start Time: The initialization time of the IoC container can affect the launch speed of the application.
  • Runtime Performance: Reflection and dynamic proxies can cause overhead in method calls.
  • Memory Usage: As the number of objects managed by the container increases, memory consumption also increases.
  • Garbage Collection: Frequent object creation and destruction operations can intensify garbage collection processes.
  • Caching Strategies: Caching frequently used objects can improve performance.

Observing the application's behavior in different scenarios and identifying potential bottlenecks through performance testing is critical. Analyzing CPU and memory usage using profiling tools can provide valuable information to guide optimization efforts. It's important to remember that: DI and IoC The advantages provided by the principles can be achieved without causing performance problems with careful planning and optimization.

Conclusion: Dependency Injection Benefits of Using

Dependency Injection (DI)It's becoming increasingly important as a design principle in modern software development. This approach reduces dependencies between components, making code more modular, testable, and maintainable. Thanks to DI, the lack of tight coupling between different components minimizes the risk of a system change impacting other components. Furthermore, code reusability increases because dependencies are injected externally, allowing components to be easily used across different contexts.

One of the biggest benefits of DI is testability This significantly increases the reliability of the test. Externally injecting dependencies allows the use of mock objects instead of real dependencies during unit testing. This simplifies testing each component in isolation and increases the likelihood of detecting errors early. The table below examines the positive effects of DI on testing processes in more detail.

Feature Before DI After DI
Test Independence Low High
Using Mock Objects Difficult Easy
Testing Period LONG Short
Error Detection Late Early

With this, IoC (Inversion of Control) Using containers further enhances the benefits of DI. IoC containers reduce developer workload by automating the management and injection of dependencies. These containers allow application configuration to be centralized, streamlining dependency management. Furthermore, managing objects with different lifecycles is also facilitated; for example, the creation and management of singleton or transient objects can be automated by IoC containers.

Dependency Injection And IoC container Its use is an essential approach for improving the quality of software projects, accelerating development processes, and reducing maintenance costs. Proper application of these principles enables the development of more flexible, scalable, and sustainable applications. Here are some suggestions for putting DI into action:

  1. Clearly Define Dependencies: Determine what dependencies each component requires.
  2. Use Interfaces: Define dependencies through interfaces rather than concrete classes.
  3. IoC Container Integration: Integrate a suitable IoC container into your project (e.g., Autofac, Ninject, Microsoft.Extensions.DependencyInjection).
  4. Choose Constructor Injection: Inject dependencies via constructor.
  5. Automate Tests: Test each component regularly and isolate dependencies using mock objects.
  6. Create Documentation: Document in detail how dependencies are managed and injected.

Frequently Asked Questions

Why is Dependency Injection so important and what problems does it help us solve?

Dependency injection increases flexibility, testability, and maintainability in software development, making code more modular and manageable. By reducing tight coupling, it ensures that one component is less affected by changes in other components. This facilitates code reusability for different environments or requirements, and simplifies unit testing.

What exactly does an IoC Container do and how does it simplify the development process?

An IoC container simplifies the development process by automating the creation of objects and managing their dependencies. It allows developers to focus on business logic rather than worrying about the details of object creation and dependency resolution. An IoC container creates objects and automatically injects necessary dependencies when the application is launched or when needed, helping to keep code cleaner and more organized.

What Dependency Injection methods are available and what should we consider when choosing one over another?

There are three basic methods of dependency injection: Constructor Injection, Setter Injection, and Interface Injection. Constructor Injection is generally preferred for mandatory dependencies, while Setter Injection is more suitable for optional dependencies. Interface Injection offers a more flexible approach but can be more complex to use. The choice of method should be based on the application's requirements, the necessity of the dependencies, and code readability.

What factors can affect performance when using an IoC Container and what can be done to minimize these effects?

Using an IoC container can add overhead to object creation and dependency resolution. This can impact performance, especially in large and complex applications. To minimize these impacts, it's important to configure the container correctly, avoid creating unnecessary objects, and use techniques like lazy initialization. Furthermore, leveraging the container's caching mechanisms and properly managing the object lifecycle can also improve performance.

What is the relationship between Dependency Injection and unit testing? How can we make our code more testable?

Dependency Injection significantly improves code testability. By injecting dependencies externally, mock objects can be used instead of real dependencies during testing. This allows unit tests to be run in an isolated environment, making it easier to control the behavior of the component under test. By defining dependencies through abstract interfaces and creating mock implementations of these interfaces, we can more easily write and implement test cases.

What are the popular Dependency Injection libraries that we can use in our projects and what should we consider when choosing these libraries?

On the .NET side, Autofac, Ninject, and Microsoft.Extensions.DependencyInjection are commonly used dependency injection libraries. On the Java side, Spring Framework, Guice, and Dagger are popular. When selecting a library, factors such as the project's needs, the library's performance, community support, and the learning curve should be considered. Furthermore, the library's compatibility with the application architecture and compatibility with existing tools should also be considered.

What are the tangible benefits of using Dependency Injection when writing code in the development process?

Dependency injection makes code more modular, flexible, and maintainable. It increases code reusability, reduces dependencies, and simplifies testability. It also facilitates teamwork because different developers can work independently on different components. It helps create a cleaner, more readable, and more maintainable codebase, which reduces development costs in the long run.

What are the most common mistakes when performing Dependency Injection and how can we avoid them?

One of the most common mistakes is overusing dependencies, creating unnecessary complexity (over-injection). Another mistake is mismanaging the dependency lifecycle and overusing singleton objects. Furthermore, misconfiguring the IoC container, which can lead to performance issues, is also a common mistake. To avoid these mistakes, it's important to carefully analyze dependencies, create a simple and understandable code structure, and configure the container correctly.

More information: Martin Fowler – Inversion of Control Containers and the Dependency Injection pattern

Leave a Reply

Access Customer Panel, If You Don't Have a Membership

© 2020 Hostragons® is a UK-based hosting provider with registration number 14320956.