You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在2sxc v17.3+版本中,能否从应用外部获取Typed对象?

在2sxc v17+的DNN外部场景获取Typed对象的解决方案

针对你在DNN主题、DDR Menu Razor模板这类2sxc应用外部场景获取ITypedItem的需求,2sxc v17+提供了官方支持的现代方案,无需依赖旧的IDynamicCodeService,具体实现如下:

核心实现代码

在DNN主题或DDR模板的Razor代码中,通过IServiceProvider获取2sxc公开服务来获取IAppTyped并查询Typed数据:

// 获取当前请求的服务容器
var serviceProvider = HttpContext.RequestServices;

// 获取2sxc的IAppService(v17+公开服务)
var appService = serviceProvider.GetRequiredService<IAppService>();

// 通过AppId获取目标应用的IAppTyped实例(示例中AppId为7)
var appTyped = appService.GetApp(appId: 7).AsTyped();

// 以Typed方式查询指定ContentType的数据(示例ContentType为"Article")
var typedItems = appTyped.Data["Article"].GetAll();

// 遍历数据并传入你的ITypedItem辅助方法
foreach (var item in typedItems)
{
    // 调用已适配Typed的辅助方法
    YourExistingTypedHelperMethod(item);
}

关键说明

  1. 为什么不直接用ServiceKit16:ServiceKit系列是为2sxc内部Razor组件设计的内部机制,标记为非公开API,外部场景直接实例化会遇到访问限制,官方不推荐这种用法。
  2. 替代旧IDynamicCodeService的优势:IAppService是2sxc v17+推出的公开服务接口,完全兼容Typed体系,避免后续IDynamicCode12弃用带来的重构成本。
  3. 简化封装(可选):如果你希望实现类似.OfApp(7)的简洁调用,可以自行封装扩展方法:
public static class AppTypedExtensions
{
    public static IAppTyped OfApp(this IServiceProvider serviceProvider, int appId)
    {
        var appService = serviceProvider.GetRequiredService<IAppService>();
        return appService.GetApp(appId).AsTyped();
    }
}

封装后即可通过serviceProvider.OfApp(7)直接获取目标应用的IAppTyped实例。

关于你的建议反馈

2sxc团队确实在持续优化外部场景的API体验,你提到的简化IAppTyped获取方式、提供IRenderService/IDynamicCodeService的现代等效实现,都是官方后续版本可能迭代的方向,目前通过IAppService的方案已经是最稳定的公开实现路径。

内容的提问来源于stack exchange,提问作者Jeremy Farrance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 01:51:18