Service Fabric Actor服务依赖注入和Actor事件

时间:2016-09-22 20:02:49

标签: c# dependency-injection azure-service-fabric service-fabric-actor

当演员服务旋转时,我想自动订阅任何事件described in the documentation。手动订阅活动有效。但是,当实例化服务时,有没有办法自动订阅actor服务,就像OnActivateAsync()?

我尝试做的是通过依赖注入来解决这个问题,在MyActor类的实例化中它通过OnActivateAsync调用的接口来传递客户端的事件。但是我遇到依赖注入问题。

使用Microsoft.ServiceFabric.Actors.2.2.207应该支持对actor服务的依赖注入。现在,当实现Microsoft.ServiceFabric.Actors.Runtime.Actor时,会创建一个带有ActorService和ActorId参数的默认构造函数。

我想添加自己的构造函数,其中传入了一个额外的接口。如何编写actor服务的注册以添加依赖项?在默认的Program.cs Main中,它提供了这个

IMyInjectedInterface myInjectedInterface = null;

// inject interface instance to the UserActor
ActorRuntime.RegisterActorAsync<MyActor>(
   (context, actorType) => new ActorService(context, actorType, () => new MyActor(myInjectedInterface))).GetAwaiter().GetResult();

然而,在它所说的行#34;()=&gt;新的MyActor(myInjectedInterface)&#34;它告诉我一个错误

  

代表&#39; Func&#39;不带0   参数

查看Actor类的构造函数,它具有以下内容

MyActor.Cs

internal class MyActor : Microsoft.ServiceFabric.Actors.Runtime.Actor, IMyActor
{
    private ActorService _actorService;
    private ActorId _actorId;
    private IMyInjectedInterface _myInjectedInterface;

    public SystemUserActor(IMyInjectedInterface myInjectedInterface, ActorService actorService = null, ActorId actorId = null) : base(actorService, actorId)
    {
        _actorService = actorService;
        _actorId = actorId;
        _myInjectedInterface = myInjectedInterface;
    }
}

1)如何解决尝试解决Actor Dependency时收到的错误?

  

代表&#39; Func&#39;不带0   参数

奖金问题:

当我的无状态服务(调用客户端)调用时,如何解析IMyInjectedInterface以将接口实例注入到actor服务中?

1 个答案:

答案 0 :(得分:4)

IMyInjectedInterface myInjectedInterface = null;
//inject interface instance to the UserActor

ActorRuntime.RegisterActorAsync<MyActor>(
    (context, actorType) => new ActorService(context, actorType, 
        (service, id) => new MyActor(myInjectedInterface, service, id)))

    .GetAwaiter().GetResult();

创建actor实例的函数的签名是:

Func<ActorService, ActorId, ActorBase>

框架提供了ActorServiceActorId的实例,您可以将其传递给Actor的构造函数,然后传递给基础构造函数。

奖金回答:

这里的用例与您的想法略有不同。这里的模式是通过接口解耦具体实现的一般模式 - 它不是客户端应用程序修改运行时行为的方式。因此,调用客户端不提供依赖项的具体实现(至少不通过构造函数注入)。依赖项在编译时注入。 IoC容器通常会这样做,或者您可以手动提供一个。