【发布时间】:2021-03-17 04:31:39
【问题描述】:
我想知道如何设置我的依赖注入来将依赖注入到具有公共 getter 和 setter ({get; set}) 的属性中。
所以,一个例子是:
namespace Dexter.Services {
public class CommandHandlerService : InitializableModule {
public CommandService CommandService { get; set; }
}
}
使用以下依赖注入器:
namespace Dexter {
public static class InitializeDependencies {
public static async Task Main() {
ServiceCollection ServiceCollection = new();
CommandService CommandService = new();
ServiceCollection.AddSingleton(CommandService);
Assembly.GetExecutingAssembly().GetTypes()
.Where(Type => Type.IsSubclassOf(typeof(InitializableModule)) && !Type.IsAbstract)
.ToList().ForEach(
Type => ServiceCollection.TryAddSingleton(Type)
);
ServiceProvider = ServiceCollection.BuildServiceProvider();
// Initialization stuff.
}
}
}
在本例中,我希望 CommandService 自动注入到属性中。
我知道这是可能的,因为 Discord.NET 能够做到这一点,而且我愿意坚持使用相同的代码风格。
(Discord.NET:https://docs.stillu.cc/guides/commands/dependency-injection.html)
谢谢!
【问题讨论】:
-
I know this is possible不,这是不可能的。不适用于 Microsoft.Extensions.DependencyInjection。您的链接指向第三方 DI 库,该库使用自己的服务注入一些特定的类和属性 -
我怀疑
_commands.AddModulesAsync检查所有模块类型的公共属性并为创建类型并设置任何公共属性的类型注册工厂方法。 -
那么实现这一目标的最佳方法是什么?
-
你必须做 Discord.NET 所做的事情——编写你自己的代码来检查一个类型,找到可以通过反射注入的属性并设置它们。使用使用 Func 的 TryAddSingleton 重载
-
使用构造函数注入可能更容易并且避免产生半构建的对象。
标签: c# .net .net-core dependency-injection .net-5