Dependency-injection-related Questions
In the following section, you will find common questions and answers
to utilizing dependency injection with @Discord.Commands, as well as
common troubleshooting steps regarding DI.
What is a service? Why does my module not hold any data after execution?
In Discord.Net, modules are created similarly to ASP.NET, meaning
that they have a transient nature; modules are spawned whenever a
request is received, and are killed from memory when the execution
finishes. In other words, you cannot store persistent
data inside a module. Consider using a service if you wish to
workaround this.
Service is often used to hold data externally so that they persist
throughout execution. Think of it like a chest that holds
whatever you throw at it that won't be affected by anything unless
you want it to. Note that you should also learn Microsoft's
implementation of Dependency Injection (video) before proceeding,
as well as how it works in Discord.Net.
A brief example of service and dependency injection can be seen below.
[!code-csharpDI]
Why is my CommandService
complaining about a missing dependency?
If you encounter an error similar to Failed to create MyModule, dependency MyExternalDependency was not found.
, you may have
forgotten to add the external dependency to the dependency container.
Starting from Discord.Net 2.0, all dependencies required by each
module must be present when the module is loaded into the
CommandService. This means when loading the module, you must pass a
valid IServiceProvider with the dependency loaded before the module
can be successfully registered.
For example, if your module, MyModule
, requests a DatabaseService
in its constructor, the DatabaseService
must be present in the
IServiceProvider when registering MyModule
.
[!code-csharpMissing Dependencies]