在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); }
关键说明
- 为什么不直接用ServiceKit16:ServiceKit系列是为2sxc内部Razor组件设计的内部机制,标记为非公开API,外部场景直接实例化会遇到访问限制,官方不推荐这种用法。
- 替代旧IDynamicCodeService的优势:
IAppService是2sxc v17+推出的公开服务接口,完全兼容Typed体系,避免后续IDynamicCode12弃用带来的重构成本。 - 简化封装(可选):如果你希望实现类似
.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
相关产品推荐
相关产品推荐

