2.2 Orleans 中的代码生成

<<返回目录

代码生成

Orleans运行时利用生成的代码以确保跨集群对象类型适当地序列化,并且生成把方法传递、异常传播和其他内部运行时概念的实现细节抽象掉的辅助代码。(翻译:野牛bison)

启用代码生成

代码生成有两种方式:运行时生成和构建时生成。

构建时生成

构建时生成是Orleans的首选方式,可以使用以下的包进行构建时代码生成:

  • Microsoft.Orleans.OrleansCodeGenerator.Build. 使用.Net 反射分析,并使用 Roslyn 生成代码.
  • Microsoft.Orleans.CodeGenerator.MSBuild. 一个新的代码生成库,它利用Roslyn进行代码生成和代码分析。 它不会加载应用程序二进制文件,因此可以避免因依赖版本冲突和不同的目标框架而导致的问题;并且改进了对增量构建的支持,可以缩短构建时间。

这些包应安装到所有项目中,包括 Grain, IGrain, 自定义序列化器和在 Grain 间传递的类型库。安装包会将一个 Target 注入到项目中,在构建时将生成代码。

在 dotnet core中, target配置在xxx.csproj.nuget.g.targets中,例如:

    <Import Project="$(NuGetPackageRoot)microsoft.orleans.codegenerator.msbuild\2.3.2\build\Microsoft.Orleans.CodeGenerator.MSBuild.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.orleans.codegenerator.msbuild\2.3.2\build\Microsoft.Orleans.CodeGenerator.MSBuild.targets')" />

注意:以上两个软件包只支持C#项目, 可以使用下面Microsoft.Orleans.OrleansCodeGenerator包支持其他语言,或者通过创建C#项目来支持其他语言,该项目可以充当从用其他语言编写的程序集生成的代码的目标。

通过在目标项目的csproj文件中指定OrleansCodeGenLogLevel的值,可以在构建时收集额外的诊断信息。 例如,

<OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>。

运行时生成

通过安装Microsoft.Orleans.OrleansCodeGenerator包并使用IApplicationPartManager.WithCodeGeneration扩展方法,可以在Client 和 Silo 启动时执行代码生成。

builder.ConfigureApplicationParts(
    parts => parts
        .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
        .WithCodeGeneration());

在上面的示例中,builder可以是ISiloHostBuilderIClientBuilder的实例。 ILoggerFactory(可选)实例可以传递给WithCodeGeneration以在代码生成期间启用日志记录,例如:

ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
    parts => parts
        .AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
        .WithCodeGeneration(codeGenLoggerFactory));

定制代码生成

为特定类型生成代码

代码生成组件会自动为 Grain的接口及其实现、Grain State和Grain方法的参数类型自动生成代码。如果要为额外的类型生成代码,可以用下面的方法来使组件生成器为它们生成代码:

  • [Serializable]添加到类型会指示代码生成器为该类型生成序列化程序。
  • [assembly:GenerateSerializer(Type)]添加到项目会指示代码生成器将该类型视为可序列化,如果无法为该类型生成序列化程序,则会导致错误,例如因为该类型不可访问。 如果启用了代码生成,则此错误将暂停构建。 此属性还允许从另一个程序集生成特定类型的代码。
  • [assembly:KnownType(Type)]还指示代码生成器包含特定类型(可能来自引用的程序集),但如果类型不可访问则不会导致异常。

为所有子类型生成代码

[KnownBaseType]添加到接口或类会指示代码生成器为继承/实现该类型的所有类型生成序列化代码。

为另一个程序集中的所有类型生成代码

在某些情况下,生成的代码在构建时不能包含在特定的程序集中。 例如,这可以包括不引用Orleans的共享库,用C#以外的语言编写的程序集,以及开发人员没有源代码的程序集。 在这些情况下,可以将这些程序集的生成代码放入一个在初始化期间引用的单独程序集中。

为了做到这一点,我们需要按如下步骤操作:

  • 创建一个 C# 项目
  • 安装Microsoft.Orleans.CodeGenerator.MSBuildMicrosoft.Orleans.OrleansCodeGenerator.Build
  • 将目标程序集添加到引用
  • 在C#文件顶部添加[assembly: KnownAssembly("OtherAssembly")]

KnownAssembly属性指示代码生成器检查指定的程序集并为其中的类型生成代码。 该属性可以在项目中多次使用。

然后必须在初始化期间将生成的程序集添加到 Client / Silo中:

builder.ConfigureApplicationParts(
    parts => parts.AddApplicationPart("CodeGenAssembly"));

在上面的示例中,builder可以是ISiloHostBuilderIClientBuilder的实例。

KnownAssemblyAttribute有一个可选属性TreatTypesAsSerializable,可以将其设置为true以指示代码生成器视该程序集中的所有类型都为可序列化类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269