Azure服务结构:使用无状态服务将数据存储到有状态服务(c#编程)
目标:希望在Azure服务结构:使用无状态服务将数据存储到有状态服务(c#编程),c#,azure-service-fabric,C#,Azure Service Fabric,目标:希望在无状态服务中创建具有某些实体的产品,并且所创建的产品应存储在有状态服务中(IReliableDictionary) 如果我在有状态服务中添加产品,则该产品将被添加到数据库中(IReliableDictionary)。这是测试和工作 下一个任务,我所做的是在解决方案中添加一个新的服务(stateless)。无状态应创建具有某些实体的产品(Id,Name)。创建的产品应添加到我的数据库中(statefulservice) 问题:我可以创建带有某些实体的产品,但该产品没有添加到我的数据库中
无状态
服务中创建具有某些实体的产品,并且所创建的产品应存储在有状态
服务中(IReliableDictionary
)
如果我在有状态服务中添加产品,则该产品将被添加到数据库中(IReliableDictionary
)。这是测试和工作
下一个任务,我所做的是在解决方案中添加一个新的服务(stateless
)。无状态
应创建具有某些实体的产品(Id
,Name
)。创建的产品应添加到我的数据库中(stateful
service)
问题:我可以创建带有某些实体的产品,但该产品没有添加到我的数据库中,因为它要求我在无状态
服务中创建IReliableStateManager
的实例,并且stateManager
始终为null
如何在无状态
服务中创建IReliableStateManager
的实例
因为IReliableStateManager
是由stateful
服务继承提供的
等级制度我正在无状态
服务中创建存储库的实例
//(stateManager is never assigned to and will always have its dafult value null)
private static IReliableStateManager stateManager;
private ServiceFabricRepository = new ServiceFabricRepository(stateManager)
我做了一些搜索,发现stateful
服务用于数据存储(示例接口:AddProduct
或GetProduct
)而无状态Web Api
用于使用服务远程处理或Http
公开有状态
服务的接口,用于服务之间的通信。但是我找不到我的场景的任何例子
对于任何帮助或建议都将非常有用
感谢和问候您没有在无状态服务中直接使用IReliableStateManager,而是从无状态调用有状态服务,需要保存pass对象 例如: 在无状态服务中创建有状态服务的服务代理并调用其方法:
IProductService = ServiceProxy.Create<IProductService>(new Uri("fabric:/SfSample/ProductService"), new ServicePartitionKey(0));
var newProduct = new Product()
{
Name = product.Name,
Id = product.Id
};
await _productService.AddProduct(newProduct);
IProductService=ServiceProxy.Create(新Uri(“结构:/SfSample/ProductService”),新ServicePartitionKey(0));
var newProduct=新产品()
{
Name=product.Name,
Id=产品Id
};
wait_productService.AddProduct(新产品);
和有状态服务:
public class ProductService : StatefulService, IProductService
{
public async Task AddProduct(Product product)
{
var products = await StateManager.GetOrAddAsync<IReliableDictionary<Guid, Product>>("products");
using (var tx = StateManager.CreateTransaction())
{
await products.AddOrUpdateAsync(tx, product.Id, product, (id, value) => product);
await tx.CommitAsync();
}
}
...........
}
公共类ProductService:StatefulService、IPProductService
{
公共异步任务AddProduct(产品产品)
{
var products=await StateManager.GetOrAddAsync(“产品”);
使用(var tx=StateManager.CreateTransaction())
{
wait products.AddOrUpdateAsync(tx,product.Id,product,(Id,value)=>product);
wait tx.CommitAsync();
}
}
...........
}
无状态服务不是前端web API,因此我需要使用服务远程处理。也无法在无状态服务(专用IPProductService productService)中直接使用IPProductService,因为它表示没有隐式转换。由于这些是独立的服务,因此必须使用服务远程处理进行通信。对于IPProductService,您必须创建如下代理:IPProductService=ServiceProxy.create(新Uri(“结构:/SfSample/ProductService”)、新ServicePartitionKey(0));
public class ProductService : StatefulService, IProductService
{
public async Task AddProduct(Product product)
{
var products = await StateManager.GetOrAddAsync<IReliableDictionary<Guid, Product>>("products");
using (var tx = StateManager.CreateTransaction())
{
await products.AddOrUpdateAsync(tx, product.Id, product, (id, value) => product);
await tx.CommitAsync();
}
}
...........
}