简体中文
快速依赖注入
每加一个服务,都要手写构造函数来接收它,会有些重复。这里可以用 [Autowired] 和 [CheckAutowired] 帮你生成这些代码。
使用前,给类加上 public partial,并引用 ShadowPluginLoader.Attributes。
给属性加上 Autowired
比如这个 ViewModel 需要写日志:
csharp
using Serilog;
using ShadowPluginLoader.Attributes;
namespace ShadowExample.ViewModels;
public partial class StatusViewModel
{
[Autowired]
public ILogger Logger { get; }
partial void ConstructorInit()
{
Logger.Information("StatusViewModel initialized");
}
}构建时,工具会生成类似这样的构造函数:
csharp
public StatusViewModel(ILogger logger)
{
Logger = logger;
ConstructorInit();
}拿到 Logger 后,会接着调用 ConstructorInit()。如果还有自己的初始化代码,放在这个方法里即可,不用另外手写构造函数。
基类也需要参数怎么办
给派生类加上 [CheckAutowired],工具会把基类需要的参数一起带上。例如前面的插件主类,生成的构造函数是这样的:
csharp
public EmojiPlugin(ExampleMetaData meta, ILogger logger,
PluginEventService pluginEventService)
: base(meta, logger, pluginEventService)
{
ConstructorInit();
}这段代码会自动生成,了解它做了什么就好,不需要再复制进插件类。
别忘了注册服务
生成构造函数后,DryIoc 还需要知道服务从哪里来。你自己写的服务,要先用 DiFactory.Services.Register<TService, TImplementation>() 等方法注册。
插件主类和符合要求的配置类由加载器帮忙注册,不用重复处理。
控件也可以这样注入依赖。把 this.LoadComponent(ref _contentLoaded) 放进 ConstructorInit(),就能在依赖准备好后加载 XAML,见自定义控件。