Service Fabric Actor Interfaces 实现多个接口
Service Fabric Actor Interfaces implementing multiple interfaces
我正在构建一个应用程序,其中我有多个不同的参与者类型,它们对一些不同的数据对象具有相同类型的行为 (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
派生,但可以理解这是不允许的,当我尝试部署时出现 "Generic interfaces cannot be remoted." 错误,所以我尝试了这个.
当我现在构建项目时,我收到以下错误日志:
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 没有实现任何参与者接口,但它显然实现了。有谁知道这是一个错误,还是有实际的解决方法?让这个工作可以为我节省很多重复的代码。
谢谢!
Service Fabric 当前不支持通用 service/actor 接口。您看到的第二个错误是因为它还过滤掉了继承自不继承自 IActor
的接口的接口(例如您的 IDataActor<T>
)。可以在那里改进错误消息。
为了解决 services 的这个限制,我使用了 Castle DynamicProxy(代码对于 SO 答案来说太长太复杂;我可能会把它写在博客中post 有空的时候)。
话虽如此,我认为您可能想要考虑 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
派生,但可以理解这是不允许的,当我尝试部署时出现 "Generic interfaces cannot be remoted." 错误,所以我尝试了这个.
当我现在构建项目时,我收到以下错误日志:
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 没有实现任何参与者接口,但它显然实现了。有谁知道这是一个错误,还是有实际的解决方法?让这个工作可以为我节省很多重复的代码。
谢谢!
Service Fabric 当前不支持通用 service/actor 接口。您看到的第二个错误是因为它还过滤掉了继承自不继承自 IActor
的接口的接口(例如您的 IDataActor<T>
)。可以在那里改进错误消息。
为了解决 services 的这个限制,我使用了 Castle DynamicProxy(代码对于 SO 答案来说太长太复杂;我可能会把它写在博客中post 有空的时候)。
话虽如此,我认为您可能想要考虑 actor 应该封装的不仅仅是数据。您应该公开表示 行为 的操作。否则很可能会导致高耦合、可维护性下降、重复代码等——这在某种程度上违背了微服务的目的。