feat: 公开宿主组合加载 API、Forge 风格依赖版本区间与加载顺序、程序集解析策略
- ShrinkModComponentDiscovery.Discover 公开:只发现、不执行生命周期 - ShrinkModLoader.LoadComposed / ShrinkModCordisRuntime.ApplyComposedAsync:宿主提供元数据组合加载,支持纯数据包与 IShrinkModWrapper 公开真实实例 - 公开 TryAttachEventBusInstance,随生命周期逆操作释放 - 依赖新增 VersionRange(Maven/Forge 区间语法)与 Ordering(Before/After) - AssemblyResolvePolicy 可限制跨模组程序集解析
This commit is contained in:
1 parent
5398036d3b
commit
d15bf00512
29 files changed
+917
-132
No files matched your search
@@ -2,9 +2,15 @@ using System;
|
||||
|
||||
namespace ShrinkModFramework
|
||||
{
|
||||
/// <summary>宿主包装器执行生命周期;Handle 和自动订阅使用 PublicInstance。数据包可返回 null。</summary>
|
||||
public interface IShrinkModWrapper : IShrinkMod
|
||||
{
|
||||
IShrinkMod PublicInstance { get; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 延迟模组组件源。Revision 是来源内容的稳定指纹(外部 DLL 可使用文件哈希);
|
||||
/// 同一 ModId 的 revision/factory 变化由 ShrinkModContextHost 作为替换事务处理。
|
||||
/// 同一 ModId 的 revision/metadata 变化由 ShrinkModContextHost 作为替换事务处理。
|
||||
/// </summary>
|
||||
public sealed class ShrinkModComponentSource
|
||||
{
|
||||
@@ -23,5 +29,27 @@ namespace ShrinkModFramework
|
||||
public ShrinkModInfo Info { get; }
|
||||
public string Revision { get; }
|
||||
public Func<IShrinkMod> Factory { get; }
|
||||
|
||||
internal ShrinkExternalModAssemblyLoader.RevisionState DiscoveryState { get; set; }
|
||||
|
||||
/// <summary>替换清单元数据或生命周期工厂,同时保留授权发现的程序集 revision。</summary>
|
||||
public ShrinkModComponentSource WithMetadata(ShrinkModInfo info, string revision,
|
||||
Func<IShrinkMod> factory = null) =>
|
||||
new ShrinkModComponentSource(info, revision, factory ?? Factory) { DiscoveryState = DiscoveryState };
|
||||
|
||||
/// <summary>创建无入口类型的数据包;可选生命周期工厂用于注册内容和可逆效应。</summary>
|
||||
public static ShrinkModComponentSource CreateDataOnly(ShrinkModInfo info, string revision,
|
||||
Func<IShrinkMod> factory = null)
|
||||
{
|
||||
if (info == null) throw new ArgumentNullException(nameof(info));
|
||||
if (info.EntryType != null)
|
||||
throw new ArgumentException("A data-only mod must have no entry type.", nameof(info));
|
||||
return new ShrinkModComponentSource(info, revision, factory ?? (() => new EmptyDataMod()));
|
||||
}
|
||||
|
||||
private sealed class EmptyDataMod : ShrinkModBase, IShrinkModWrapper
|
||||
{
|
||||
public IShrinkMod PublicInstance => null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user