Eco自定义服务中调用含AsTaJson派生属性报错的解决方法咨询
解决方法
空引用异常触发原因:AsTaJson是ITaJsonService提供的扩展方法,不支持直接写在类的派生属性DerivationOCL规则中。派生属性求值时仅加载基础OCL运行时,不会自动初始化TaJson序列化所需的服务上下文,因此会抛出空引用错误。
正确实现流程如下:
- 第一步:移除Class1中使用AsTaJson的派生属性,不需要通过派生属性中转Json结果
- 第二步:在自定义的
IMyService中新增对应方法,直接通过ITaJsonService生成序列化结果
更新后的服务代码示例:
public interface IMyService { int Class1Count(); // 新增获取Json的方法 string GetFirstClass1Json(); } public class MyServiceClass : IMyService { private IEcoServiceProvider ServiceProvider { get; set; } public MyServiceClass(IEcoServiceProvider serviceProvider) { ServiceProvider = serviceProvider; } public int Class1Count() { var v = ServiceProvider.GetEcoService<IOclService>().Evaluate("Class1.allInstances->size"); return (int)v.AsObject; } // 新增方法实现 public string GetFirstClass1Json() { var oclService = ServiceProvider.GetEcoService<IOclService>(); var class1Instance = oclService.Evaluate("Class1.allInstances->first").AsObject as Class1; // 空判断避免无数据时报错 if (class1Instance == null) { return "{}"; } // 获取ITaJsonService服务 var taJsonService = ServiceProvider.GetEcoService<Eco.Services.TaJson.ITaJsonService>(); // 参数依次为:要序列化的对象、已定义的ViewModel名称、是否序列化关联对象 return taJsonService.Generate(class1Instance, "SampleViewModel", false); } }
- 第三步:控制器中直接调用新增的方法即可,原有控制器结构不需要修改:
[HttpGet("getclass1json")] public string GetClass1Json() { using (EcoSpace1 es = new EcoSpace1()) { es.Active = true; return es.MyService.GetFirstClass1Json(); } }
异常排查注意点:
- 确认EcoSpace配置中已经注册了TaJson相关服务,在EcoSpace的
ConfigureServices方法中添加如下注册逻辑即可:Eco.Services.TaJson.TaJsonServiceRegistrator.RegisterServices(serviceCollection);
- 确认模型中已经存在名称为
SampleViewModel的ViewModel定义,名称大小写完全匹配,且包含需要序列化的字段配置。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

