ASP.NET CORE API 使用Orleans

快速使用Monimal API 快速集成Orleans 微软官网地址如下:

https://learn.microsoft.com/zh-cn/dotnet/orleans/quickstarts/build-your-first-orleans-app?source=recommendations&tabs=visual-studio

当然它的存储grain存储采用的是内存级别存储,我缓存了mssql 存储。如果是内存存储使用如下代码就Ok

 siloBuilder.AddMemoryGrainStorage("urls");

我采用的是数据库存储:

siloBuilder.AddAdoNetGrainStorage("OrleansStorage", options =>
    {
        
        options.Invariant = "System.Data.SqlClient";
        options.ConnectionString = "Server=.;Database=OrleansStorage;Persist Security Info=True;User ID=sa;password=Sasa123;";
       
    });

当然这过程中需要引入的库如下:

Microsoft.Orleans.Persistence.AdoNet: ado.net存储

Microsoft.Orleans.Server :orleans 开启服务

System.Data.SqlClient :ado 操作数据库驱动程序,ado.net 开发使用库

Program.cs 完整代码如下:

using Microsoft.AspNetCore.Http.Extensions;
using Orleans.Runtime;
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseOrleans(siloBuilder =>
{
    siloBuilder.UseLocalhostClustering();
    //siloBuilder.AddMemoryGrainStorage("urls");
    siloBuilder.AddAdoNetGrainStorage("OrleansStorage", options =>
    {
        
        options.Invariant = "System.Data.SqlClient";
        options.ConnectionString = "Server=.;Database=OrleansStorage;Persist Security Info=True;User ID=sa;password=Sasa123;";
       
    });

});

// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}


app.MapGet("/", () => "Hello World!");

app.MapGet("/shorten/{*path}",
  async (IGrainFactory grains, HttpRequest request, string path) =>
  {
      // Create a unique, short ID
      var shortenedRouteSegment = Guid.NewGuid().GetHashCode().ToString("X");

      // Create and persist a grain with the shortened ID and full URL
      var shortenerGrain = grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
      await shortenerGrain.SetUrl(path);

      // Return the shortened URL for later use
      var resultBuilder = new UriBuilder(request.GetEncodedUrl())
      {
          Path = $"/go/{shortenedRouteSegment}"
      };

      return Results.Ok(resultBuilder.Uri);
  });

app.MapGet("/go/{shortenedRouteSegment}",
    async (IGrainFactory grains, string shortenedRouteSegment) =>
    {
        // Retrieve the grain using the shortened ID and redirect to the original URL        
        var shortenerGrain = grains.GetGrain<IUrlShortenerGrain>(shortenedRouteSegment);
        var url = await shortenerGrain.GetUrl();

        return Results.Redirect(url);
    });

app.Run();




#region grain 粒度
/// <summary>
/// grain 接口 粒度
/// </summary>
public interface IUrlShortenerGrain : IGrainWithStringKey
{
    Task SetUrl(string fullUrl);
    Task<string> GetUrl();
}

public class UrlShortenerGrain : Grain, IUrlShortenerGrain
{
    private readonly IPersistentState<UrlDetails> _state;

    public UrlShortenerGrain(
            [PersistentState(stateName: "url",storageName: "urls")]
           IPersistentState<UrlDetails> state)
    {
        _state = state;
    }

    public async Task SetUrl(string fullUrl)
    {
        _state.State = new UrlDetails()
        {
            ShortenedRouteSegment = this.GetPrimaryKeyString(),
            FullUrl = fullUrl
        };
        await _state.WriteStateAsync();
    }

    public Task<string> GetUrl()
    {
        return Task.FromResult(_state.State.FullUrl);
    }
}

[GenerateSerializer]
public record UrlDetails
{
    public string FullUrl { get; set; }
    public string ShortenedRouteSegment { get; set; }
}

#endregion 

特别注意如果是需要数据库存储:除了加入上面包外,还需要执行相应脚本,脚本到微软官网地址找:

https://learn.microsoft.com/zh-cn/dotnet/orleans/host/configuration-guide/adonet-configuration 当然需要自己按数据库配置链接建立一个空库,然后执行对应SQL脚本。否则会运行报错

然后对应执行相应需要存储脚本:也就是官网对应的持久化,提醒、集群脚本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值