目标:想要在stateless
服务中创建包含某些实体的产品,并且创建的产品应存储在stateful
服务中(IReliableDictionary
)
// Task done: I am working with Azure Service Fabric. Firstly, I created a
// stateful service which does the job of AddProduct and GetAllProducts and the
// data is stored in IReliableDictionary. For this I have declared, and passed
// the object in a constructor.
private readonly IReliableStateManager _stateManager;
public ServiceFabricRepository(IReliableStateManager stateManager)
{
_stateManager = stateManager;
}
如果我在stateful
服务中添加产品,则会将产品添加到数据库中(IReliableDictionary
)。这是经过测试和运作的。
接下来的任务,我所做的是在解决方案中添加一项新服务(stateless
)。 stateless
应该创建包含某些实体的产品(Id
,Name
)。创建的产品应添加到我的数据库(stateful
服务)
问题:我能够使用某些实体创建产品,但产品未添加到我的数据库中,因为它要求我在IReliableStateManager
服务中创建stateless
的实例, stateManager
始终为null
。
如何在IReliableStateManager
服务中创建stateless
的实例
因为IReliableStateManager
由stateful
服务继承提供
层次结构。我正在stateless
服务
//(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
)和stateless Web Api
用于公开使用服务远程处理的stateful
服务接口或用于服务之间通信的Http
接口。但无法为我的方案找到任何示例。
对任何帮助或建议都非常有帮助
谢谢&此致
答案 0 :(得分:2)
您不在Stateless服务中直接使用IReliableStateManager,而是从Stateless调用Stateful服务,并且需要保存传递对象。
例如: 在无状态服务中创建有状态服务的服务代理并调用其方法:
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);
有状态服务:
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();
}
}
...........
}