服务结构Actor接口实现多个接口

时间:2016-04-29 12:42:11

标签: c# azure azure-service-fabric

我正在构建一个应用程序,其中我有多个不同的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接口,但显然它确实如此。有谁知道这是一个错误,还是有一个实际的解决方法?让这项工作可以为我节省大量重复的代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

Service Fabric目前不支持通用服务/ actor接口。您看到的第二个错误是因为它还过滤掉了从未从IActor继承的接口继承的接口(例如您的IDataActor<T>)。可以在那里改进错误消息。

要解决服务的这个限制,我使用了Castle DynamicProxy(代码太长而且太复杂而无法提供答案;我可能会在博客文章中将其写入时间)。

那就是说,我想你可能想要考虑演员应该封装的不仅仅是数据。您应该公开代表行为的操作。否则,这很可能会导致高耦合,降低可维护性,重复代码等等 - 哪种方式会破坏微服务的目的。