<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Orleans框架升級指南(3.6.5-->8.0.0)

      升級指南

      官方升級指南
      https://learn.microsoft.com/zh-cn/dotnet/orleans/migration-guide?source=recommendations
       
      主要涉及以下幾個改動點
      1. ConfigureApplicationParts
      3.6.5版在Silo初始化的時候,會通過這個方法將指定目錄下的Grain加載進來
      .ConfigureApplicationParts(parts => parts.AddFromApplicationBaseDirectory())
      8.0.0版就不需要了,直接去掉這個方法,因為它有另外新的加載機制,后面會說到
       
      1. JsonGrainStateSerializerOptions
      3.6.5版的Grain狀態消息Json序列化配置,是在Silo初始化時(比如使用MongoDB作為持久化存儲)通過ConfigureJsonSerializerSettings配置的
      .AddMongoDBGrainStorage("Default", (MongoDBGrainStorageOptions op) =>
      {
          op.CollectionPrefix = "GrainStorage";
          op.DatabaseName = configSection.GetValue<string>("DataBase");
      
          op.ConfigureJsonSerializerSettings = jsonSettings =>
          {
              jsonSettings.NullValueHandling = NullValueHandling.Include;
              jsonSettings.DefaultValueHandling = DefaultValueHandling.Populate;
              jsonSettings.ObjectCreationHandling = ObjectCreationHandling.Replace;
          };
      
      })
      8.0.0版的Grain狀態消息Json序列化配置,是在Silo初始化時通過配置JsonGrainStateSerializerOptions屬性
      .Configure<JsonGrainStateSerializerOptions>(options => options.ConfigureJsonSerializerSettings =
          settings =>
          {
              settings.NullValueHandling = NullValueHandling.Include;
              settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
              settings.DefaultValueHandling = DefaultValueHandling.Populate;
          })
      但僅僅這個還不夠,還需要單獨實現一個Grain狀態的序列化器(因為8.0.3版的Orleans.Providers.MongoDB包有Bug所以才需要這一步,這個Bug已經由我向作者反饋過,詳情見https://github.com/OrleansContrib/Orleans.Providers.MongoDB/issues/136,包的作者也修復了,后續新的版本應該不用),如下
      public class NewJsonGrainStateSerializer: IGrainStateSerializer
      {
          private readonly JsonSerializerSettings jsonSettings;
      
          public NewJsonGrainStateSerializer(IOptions<JsonGrainStateSerializerOptions> options, IServiceProvider serviceProvider)
          {
              jsonSettings = OrleansJsonSerializerSettings.GetDefaultSerializerSettings(serviceProvider);
              options.Value.ConfigureJsonSerializerSettings(jsonSettings);
          }
      
          public T Deserialize<T>(BsonValue value)
          {
              using var jsonReader = new JTokenReader(value.ToJToken());
              var localSerializer = JsonSerializer.CreateDefault(jsonSettings);
              return localSerializer.Deserialize<T>(jsonReader);
          }
      
          public BsonValue Serialize<T>(T state)
          {
              var localSerializer = JsonSerializer.CreateDefault(jsonSettings);
              return JObject.FromObject(state, localSerializer).ToBson();
          }
      }
      并將NewJsonGrainStateSerializer注入到容器替換掉默認的序列化器
      .ConfigureServices(services => services.AddSingleton<IGrainStateSerializer,NewJsonGrainStateSerializer>())
       
      1. AddSimpleMessageStreamProvider
      3.6.5版中如果你使用了流式訂閱,且用的是SimpleMessageStreams(也稱為 SMS)
      .AddSimpleMessageStreamProvider(ApplicationConsts.MessageStreamName)
      8.0.0版中需要將它替換為使用MemoryStream
      .AddMemoryStreams(AeFinderApplicationConsts.MessageStreamName)
       
      1. UseOrleansClient
      3.6.5版初始化Orleans的客戶端,是通過給IClusterClient注冊一個ClientBuilder對象,如下:
      context.Services.AddSingleton<IClusterClient>(o =>
      {
          return new ClientBuilder()
              .ConfigureDefaults()
              // .UseRedisClustering(opt =>
              // {
              //     opt.ConnectionString = configuration["Orleans:ClusterDbConnection"];
              //     opt.Database = Convert.ToInt32(configuration["Orleans:ClusterDbNumber"]);
              // })
              .UseMongoDBClient(configuration["Orleans:MongoDBClient"])
              .UseMongoDBClustering(options =>
              {
                  options.DatabaseName = configuration["Orleans:DataBase"];;
                  options.Strategy = MongoDBMembershipStrategy.SingleDocument;
              })
              .Configure<ClusterOptions>(options =>
              {
                  options.ClusterId = configuration["Orleans:ClusterId"];
                  options.ServiceId = configuration["Orleans:ServiceId"];
              })
              .ConfigureApplicationParts(parts =>
                  parts.AddApplicationPart(typeof(GrainsModule).Assembly).WithReferences())
              .AddSimpleMessageStreamProvider(ApplicationConsts.MessageStreamName)
              .ConfigureLogging(builder => builder.AddProvider(o.GetService<ILoggerProvider>()))
              .Build();
      });
      8.0.0版就得換一種方式了,它直接提供了UseOrleansClient擴展方法來幫助你實現,如下:
      public static IHostBuilder UseOrleansClient(this IHostBuilder hostBuilder)
      {
          return hostBuilder.UseOrleansClient((context, clientBuilder) =>
          {
              var configSection = context.Configuration.GetSection("Orleans");
              if (configSection == null)
                  throw new ArgumentNullException(nameof(configSection), "The Orleans config node is missing");
              clientBuilder.UseMongoDBClient(configSection.GetValue<string>("MongoDBClient"))
                  .UseMongoDBClustering(options =>
                  {
                      options.DatabaseName = configSection.GetValue<string>("DataBase");
                      options.Strategy = MongoDBMembershipStrategy.SingleDocument;
                  })
                  .Configure<ClusterOptions>(options =>
                  {
                      options.ClusterId = configSection.GetValue<string>("ClusterId");
                      options.ServiceId = configSection.GetValue<string>("ServiceId");
                  })
                  .AddMemoryStreams(AeFinderApplicationConsts.MessageStreamName)
                  .AddActivityPropagation();
          });
      }
       
      1. GenerateSerializer
      3.6.5版的Grain類加載,是通過上面說到的ConfigureApplicationParts方法
      8.0.0版不用,它會自動尋找那些引用了Microsoft.Orleans.Sdk包的程序集,找出里面的Grain類自動進行加載到Silo中
      除此之外,它還需要你給每個Grain中定義的方法用到的通信類(輸入和輸出),都標上【GenerateSerializer】和【Id】注解,如下:
      [GenerateSerializer]
      public class CreateAppDto
      {
          [Id(0)] public string AppId { get; set; }
          [Id(1)] public string OrganizationId { get; set; }
          [Id(2)] public string DeployKey { get; set; }
          [MinLength(2),MaxLength(20)]
          [RegularExpression("[A-Za-z0-9\\s]+" ,ErrorMessage = "The AppName can only contain letters('A'-'Z', 'a'-'z'), numbers(0-9), and spaces(' ').")]
          [Id(3)] public string AppName { get; set; }
      }
       
      1. OnActivateAsync
      3.6.5版中關于Grain激活和失活過程的重載方法分別是
      public override async Task OnActivateAsync()
      {
          await ReadStateAsync();
          await base.OnActivateAsync();
      }
      
      public override async Task OnDeactivateAsync()
      {
          await WriteStateAsync();
          await base.OnDeactivateAsync();
      }
      8.0.0版中關于Grain激活和失活過程的重載方法分別是
      public override async Task OnActivateAsync(CancellationToken cancellationToken)
      {
          await ReadStateAsync();
          await base.OnActivateAsync(cancellationToken);
      }
      
      public override async Task OnDeactivateAsync(DeactivationReason reason, CancellationToken cancellationToken)
      {
          await WriteStateAsync();
          await base.OnDeactivateAsync(reason, cancellationToken);
      }
      主要是多了一些入參

      注意

      我這里只是列了一些主要的改動點,實際升級過程中需要注意的其他地方可以參考官方文檔。
      此博客為作者原創,轉載請注明出處,謝謝~
      posted @ 2025-01-24 17:23  月井石  閱讀(47)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 上司人妻互换中文字幕| 亚洲国产另类久久久精品黑人| 通渭县| 国产在热线精品视频99公交| 激情久久av一区二区三区| 久久国产精品夜色| 中文字幕亚洲精品人妻| 亚洲AV成人片在线观看| 国产精品国产三级国快看| 新营市| 国产成人精品亚洲午夜麻豆| 久久精品久久电影免费理论片| 亚洲乱妇熟女爽到高潮的片 | 黑人大群体交免费视频| 一本色道久久加勒比综合| 少妇被日自拍黄色三级网络| 老司机aⅴ在线精品导航| 国产在线精品中文字幕| 性色在线视频精品| 西西人体44WWW高清大胆| 静安区| 玖玖在线精品免费视频| 日韩有码中文字幕国产| 国产精品极品美女自在线观看免费| 国产午夜福利一区二区三区| 欧洲免费一区二区三区视频| 久久国产成人高清精品亚洲| 超碰人人超碰人人| 亚洲一二区在线视频播放| 国产精品无码无卡在线播放| 日韩精品毛片一区到三区| 欧美野外伦姧在线观看| 午夜福利视频| 中文字幕成熟丰满人妻| 国产精品一二三中文字幕| 伊人久久大香线蕉综合5g| 日本福利一区二区精品| 日本高清不卡一区二区三| 日本高清中文字幕免费一区二区| 平昌县| 亲子乱aⅴ一区二区三区|