我正在构建一个应用程序,其中我有多个不同的actor类型,它们对于某些不同的数据对象具有相同的行为(CRUD)。为了更容易地创建处理这个问题的代码,我试图创建一个这些actor可以实现的接口。
这意味着我有一个看起来像这样的演员界面:
public interface IMyActor1 :
IActor,
IDataActor<DataItem1>,
IDataActor<DataItem2>
IDataActor<T>
看起来像这样:
public interface IDataActor<T> where T : IDataItem
{
Task Create(T item);
Task<T> Read(string itemId);
Task Update(T item);
Task Delete(string itemId);
}
自己的演员看起来像这样
class MyActor1: Actor, IMyActor1
{
...
}
最初我尝试从IDataActor<T>
派生IActor
,但可以理解这是不允许的,我得到了“通用接口无法远程处理”。我尝试部署时出错,所以我尝试了这个。
现在,当我构建项目时,我收到以下错误日志:
System.ArgumentException: The actor type 'MyProject.ActorProject.MyActor1' does not implement any actor interfaces. An actor interface is the one that derives from 'Microsoft.ServiceFabric.Actors.IActor' type.
Parameter name: actorType
at Microsoft.ServiceFabric.Actors.Runtime.ActorTypeInformation.Get(Type actorType)
at FabActUtil.Tool.LoadActors(Assembly inputAssembly, IList`1 actorFilters, IList`1 actorTypes)
at FabActUtil.Tool.LoadActors(ToolContext context)
at FabActUtil.Tool.ProcessInput(ToolContext context)
at FabActUtil.Tool.Run(ToolArguments arguments)
at FabActUtil.Program.Main(String[] args)
该错误声称MyActor1没有实现任何actor接口,但显然它确实如此。有谁知道这是一个错误,还是有一个实际的解决方法?让这项工作可以为我节省大量重复的代码。
谢谢!
答案 0 :(得分:1)
Service Fabric目前不支持通用服务/ actor接口。您看到的第二个错误是因为它还过滤掉了从未从IActor
继承的接口继承的接口(例如您的IDataActor<T>
)。可以在那里改进错误消息。
要解决服务的这个限制,我使用了Castle DynamicProxy(代码太长而且太复杂而无法提供答案;我可能会在博客文章中将其写入时间)。
那就是说,我想你可能想要考虑演员应该封装的不仅仅是数据。您应该公开代表行为的操作。否则,这很可能会导致高耦合,降低可维护性,重复代码等等 - 哪种方式会破坏微服务的目的。