gpt4 book ai didi

c# - 使用 Orleans 的相同 Grain 接口(interface)的多个实现

转载 作者:行者123 更新时间:2023-12-02 03:04:27 29 4
gpt4 key购买 nike

我有一个具有以下结构的奥尔良应用程序:

public interface IGraintest : Orleans.IGrainWithGuidCompoundKey
{
Task Init();
}



public abstract class GraintestImpl<T> : Grain, IGraintest, Deserializer<T>
{
string streamName;
public Task Init()
{
return Task.CompletedTask;
}


public override async Task OnActivateAsync()
{
var primaryKey = this.GetPrimaryKey(out streamName);
var streamProvider = GetStreamProvider("SMSProvider");
var stream = streamProvider.GetStream<String>(primaryKey, streamName);

// To resume stream in case of stream deactivation
var subscriptionHandles = await stream.GetAllSubscriptionHandles();

if (subscriptionHandles.Count > 0)
{
foreach (var subscriptionHandle in subscriptionHandles)
{
await subscriptionHandle.ResumeAsync(OnNextMessage);
}
}

await stream.SubscribeAsync(OnNextMessage);
}

public abstract T Process(string l);

private Task OnNextMessage(string message, StreamSequenceToken sequenceToken)
{
T obj = Process(message);
//gonna do something with obj here
return Task.CompletedTask;
}
}
public class ProcessImplA: GraintestImpl<Car>
{
public override Car Process(string l)
{
return new Car(l);
}
}
public class ProcessImplB: GraintestImpl<Boat>
{
public override Boat Process(string l)
{
return new Boat(l);
}
}

这里我有一个grain,用于从流中读取消息并对它们应用一些操作。由于我想要使用不同的对象类型,因此我创建了一个抽象类来实现该接口(interface)。问题就出在这里:

var sourceOne = client.GetGrain<IGraintest>(guid, "Car");
var sourceTwo = client.GetGrain<IGraintest>(guid, "Boat");

当我像这样运行程序时,我收到错误代码:

Exception while trying to run client: Cannot resolve grain interface ID=-<blabla> to a grain class because of multiple implementations of it

所以我的问题是,我可以做一些小的改变来完成这项工作,还是必须为我想要使用的每个 ProcessImpl Grain 创建一个 Grain 接口(interface)?

最佳答案

您可以使用接受 Grain 类名称前缀的重载来消除 GetGrain 调用的歧义。

var sourceOne = client.GetGrain<IGraintest>(guid, "Car", grainClassNamePrefix: "MyNamespace.ProcessImplA");
var sourceTwo = client.GetGrain<IGraintest>(guid, "Boat", grainClassNamePrefix: "MyNamespace.ProcessImplB");

否则,如果该接口(interface)有两个实现,则运行时不知道如何决定使用哪一个。对于您的情况来说,重要的是,IGrainFactory 实现不知道有关哪个类实现哪个构造的通用接口(interface)的信息,因此它无法选择实现。

另一种方法是向你的grain类添加一个标记接口(interface),例如,你可以有IGrainTestImplBoat:

public interface IGrainTestImplBoat : Orleans.IGrainWithGuidCompoundKey { }

public class ProcessImplB : GraintestImpl<Boat>, IGrainTestImplBoat { /* ... */ }

var sourceTwo = client.GetGrain<IGrainTestImplBoat>(guid, "Boat");

关于c# - 使用 Orleans 的相同 Grain 接口(interface)的多个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59327843/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com