import{_ as r,c as g,e as k,d as l,a as s,w as n,b as a,r as p,o as A}from"./app-DlzW8FTI.js";const B={},c={class:"hint-container note"};function o(y,i){const d=p("Tabs"),e=p("RouteLink");return A(),g("div",null,[i[18]||(i[18]=k(`

插件入口类

ClassIsland 的插件需要定义一个插件入口类,插件入口类需要继承PluginBase抽象类,并添加PluginEntrance属性。如果您通过模板创建了 ClassIsland 插件,模板已经给您预先定义好了插件入口点。下面是一个插件入口的示例:

Plugin.cs
using ClassIsland.Core.Abstractions;
using ClassIsland.Core.Attributes;
using ClassIsland.Core.Controls.CommonDialog;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace HelloWorldPlugin;

[PluginEntrance]
public class Plugin : PluginBase
{
    public override void Initialize(HostBuilderContext context, IServiceCollection services)
    {
    }
}

在上面的代码中,我们定义了一个名为Plugin的类,并继承了 PluginBase抽象类。同时为Plugin类添加了PluginEntrance属性,以声明这个类是插件入口类。

这个插件入口类也会在初始化时添加到 IoC 主机上,您可以在插件注册的服务中通过依赖注入获取插件入口类实例,例如:

`,5)),l(d,{data:[{id:"服务定位器法"},{id:"构造函数注入法"}]},{title0:n(({value:t,isActive:h})=>i[0]||(i[0]=[a("服务定位器法")])),title1:n(({value:t,isActive:h})=>i[1]||(i[1]=[a("构造函数注入法")])),tab0:n(({value:t,isActive:h})=>i[2]||(i[2]=[s("div",{class:"language-csharp line-numbers-mode","data-highlighter":"shiki","data-ext":"csharp",style:{"--shiki-light":"#383A42","--shiki-dark":"#abb2bf","--shiki-light-bg":"#FAFAFA","--shiki-dark-bg":"#282c34"}},[s("pre",{class:"shiki shiki-themes one-light one-dark-pro vp-code"},[s("code",{class:"language-csharp"},[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}},"var"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#E06C75"}}," plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#56B6C2"}}," ="),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#E5C07B"}}," IAppHost"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"."),s("span",{style:{"--shiki-light":"#4078F2","--shiki-dark":"#61AFEF"}},"GetService"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"<"),s("span",{style:{"--shiki-light":"#C18401","--shiki-dark":"#E5C07B"}},"Plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},">(); "),s("span",{style:{"--shiki-light":"#A0A1A7","--shiki-light-font-style":"italic","--shiki-dark":"#7F848E","--shiki-dark-font-style":"italic"}},"// 这里的 Plugin 是您的入口点的实际类名")])])]),s("div",{class:"line-numbers","aria-hidden":"true",style:{"counter-reset":"line-number 0"}},[s("div",{class:"line-number"})])],-1)])),tab1:n(({value:t,isActive:h})=>i[3]||(i[3]=[s("div",{class:"language-csharp line-numbers-mode","data-highlighter":"shiki","data-ext":"csharp",style:{"--shiki-light":"#383A42","--shiki-dark":"#abb2bf","--shiki-light-bg":"#FAFAFA","--shiki-dark-bg":"#282c34"}},[s("pre",{class:"shiki shiki-themes one-light one-dark-pro vp-code"},[s("code",{class:"language-csharp"},[s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A0A1A7","--shiki-light-font-style":"italic","--shiki-dark":"#7F848E","--shiki-dark-font-style":"italic"}},"// 这里的 Plugin 是您的入口点的实际类名")]),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}},"public"),s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}}," class"),s("span",{style:{"--shiki-light":"#C18401","--shiki-dark":"#E5C07B"}}," Demiurge"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"("),s("span",{style:{"--shiki-light":"#C18401","--shiki-dark":"#E5C07B"}},"Plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#E5C07B"}}," plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},") {")]),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}}," private"),s("span",{style:{"--shiki-light":"#C18401","--shiki-dark":"#E5C07B"}}," Plugin"),s("span",{style:{"--shiki-light":"#4078F2","--shiki-dark":"#ABB2BF"}}," Plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}}," { "),s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}},"get"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"; } "),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#56B6C2"}},"="),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#E06C75"}}," plugin"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},";")]),a(` `),s("span",{class:"line"}),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}}," private"),s("span",{style:{"--shiki-light":"#A626A4","--shiki-dark":"#C678DD"}}," void"),s("span",{style:{"--shiki-light":"#4078F2","--shiki-dark":"#61AFEF"}}," DoSomething"),s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"() {")]),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#A0A1A7","--shiki-light-font-style":"italic","--shiki-dark":"#7F848E","--shiki-dark-font-style":"italic"}}," // 此时我们可以通过 Plugin 属性访问到当前插件入口点实例了")]),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}}," }")]),a(` `),s("span",{class:"line"},[s("span",{style:{"--shiki-light":"#383A42","--shiki-dark":"#ABB2BF"}},"}")])])]),s("div",{class:"line-numbers","aria-hidden":"true",style:{"counter-reset":"line-number 0"}},[s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"}),s("div",{class:"line-number"})])],-1)])),_:1}),i[19]||(i[19]=k(`

初始化方法

其中的Initialize初始化方法会在插件加载后马上执行。您可以在这个方法中完成插件初始化操作。下面的代码会在初始化时显示一个“Hello world!”弹窗。

Plugin.cs
// ...
namespace HelloWorldPlugin;

[PluginEntrance]
public class Plugin : PluginBase
{
    public override void Initialize(HostBuilderContext context, IServiceCollection services)
    {
        CommonDialog.ShowInfo("Hello world!");
    }

    // ...
}
`,3)),s("p",null,[i[5]||(i[5]=a("初始化方法传入了主机构造时所需的相关参数,注册")),l(e,{to:"/dev/components.html"},{default:n(()=>i[4]||(i[4]=[a("组件")])),_:1}),i[6]||(i[6]=a("、提醒提供方、服务等操作需要在这个方法完成。下面的代码会在初始化时注册一个名为 ")),i[7]||(i[7]=s("code",null,"ExampleSettingsPage",-1)),i[8]||(i[8]=a(" 的设置页面,和一个名为 ")),i[9]||(i[9]=s("code",null,"ExampleCompent",-1)),i[10]||(i[10]=a(" 的组件。"))]),i[20]||(i[20]=k(`
Plugin.cs
// ...
namespace PluginWithSettingsPage;

[PluginEntrance]
public class Plugin : PluginBase
{
    public Settings Settings { get; set; } = new();

    public override void Initialize(HostBuilderContext context, IServiceCollection services)
    {
        services.AddSettingsPage<ExampleSettingsPage>();
        services.AddComponent<ExampleComponent>();
    }

}
`,1)),s("p",null,[i[12]||(i[12]=a("您也可以在此方法向主机注册服务,详细见")),l(e,{to:"/dev/basics/dependency-injection.html#%E6%B3%A8%E5%86%8C%E6%9C%8D%E5%8A%A1"},{default:n(()=>i[11]||(i[11]=[a("依赖注入")])),_:1}),i[13]||(i[13]=a("文章。"))]),s("div",c,[i[17]||(i[17]=s("p",{class:"hint-container-title"},"注",-1)),s("p",null,[i[15]||(i[15]=a("有些注册操作需要在主机启动后进行,由于初始化方法在主机启动前执行,所以可以通过订阅")),l(e,{to:"/dev/events.html#%E5%BA%94%E7%94%A8%E5%90%AF%E5%8A%A8%E5%AE%8C%E6%88%90-appstarted"},{default:n(()=>i[14]||(i[14]=[s("code",null,"AppBase.AppStarted",-1)])),_:1}),i[16]||(i[16]=a("事件,在应用启动完成后进行注册。"))])]),i[21]||(i[21]=s("h2",{id:"获取插件信息",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#获取插件信息"},[s("span",null,"获取插件信息")])],-1)),i[22]||(i[22]=s("p",null,[a("您可以通过访问"),s("code",null,"Info"),a("来获取这个插件的相关信息,比如插件清单等。您也可以通过访问"),s("code",null,"PluginConfigFolder"),a("来获取插件配置目录路径。")],-1))])}const C=r(B,[["render",o]]),v=JSON.parse('{"path":"/dev/plugins/plugin-base.html","title":"插件入口类","lang":"zh-CN","frontmatter":{"description":"插件入口类 ClassIsland 的插件需要定义一个插件入口类,插件入口类需要继承PluginBase抽象类,并添加PluginEntrance属性。如果您通过模板创建了 ClassIsland 插件,模板已经给您预先定义好了插件入口点。下面是一个插件入口的示例: Plugin.cs 在上面的代码中,我们定义了一个名为Plugin的类,并继承了 Pl...","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"插件入口类\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2025-12-14T02:59:03.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"ClassIsland 社区\\",\\"url\\":\\"https://classisland.tech\\"}]}"],["meta",{"property":"og:url","content":"https://docs.classisland.tech/dev/plugins/plugin-base.html"}],["meta",{"property":"og:site_name","content":"ClassIsland 文档"}],["meta",{"property":"og:title","content":"插件入口类"}],["meta",{"property":"og:description","content":"插件入口类 ClassIsland 的插件需要定义一个插件入口类,插件入口类需要继承PluginBase抽象类,并添加PluginEntrance属性。如果您通过模板创建了 ClassIsland 插件,模板已经给您预先定义好了插件入口点。下面是一个插件入口的示例: Plugin.cs 在上面的代码中,我们定义了一个名为Plugin的类,并继承了 Pl..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2025-12-14T02:59:03.000Z"}],["meta",{"property":"article:modified_time","content":"2025-12-14T02:59:03.000Z"}],["link",{"rel":"alternate","hreflang":"en-us","href":"https://docs.classisland.tech/en-us/dev/plugins/plugin-base.html"}]]},"git":{"createdTime":1724500283000,"updatedTime":1765681143000,"contributors":[{"name":"WRC","username":"WRC","email":"hello_wrc@outlook.com","commits":3,"url":"https://github.com/WRC"}]},"readingTime":{"minutes":2.15,"words":645},"filePathRelative":"dev/plugins/plugin-base.md","autoDesc":true}');export{C as comp,v as data};