public static IUnityContainer WithActor <TActor>(this IUnityContainer container, ActorServiceSettings settings = null) where TActor : ActorBase { var logger = container.Resolve <ILoggerFactory>().CreateLogger <TActor>(); logger.LogInformation("Registering Actor {ActorName}", typeof(TActor).Name); if (!container.IsRegistered <IActorDeactivationInterception>()) { container.RegisterType <IActorDeactivationInterception, OnActorDeactivateInterceptor>(new HierarchicalLifetimeManager()); } container.RegisterType(typeof(TActor), ActorProxyTypeFactory.CreateType <TActor>(), new HierarchicalLifetimeManager()); ActorRuntime.RegisterActorAsync <TActor>((context, actorType) => { try { return(new ActorService(context, actorTypeInfo: actorType, actorFactory: (service, id) => container.CreateChildContainer() .RegisterInstance(service, new ContainerControlledLifetimeManager()) .RegisterInstance(id, new ContainerControlledLifetimeManager()).Resolve <TActor>(), settings: settings)); } catch (Exception ex) { logger.LogCritical(new EventId(100, "FailedToCreateActorService"), ex, "Failed to create ActorService for {ActorName}", typeof(TActor).Name); throw; } }).GetAwaiter().GetResult(); return(container); }
/// <summary> /// Add an actor implementation to the fabric container /// </summary> /// <typeparam name="TActor"></typeparam> /// <typeparam name="TActorService"></typeparam> /// <param name="container"></param> /// <param name="ActorServiceFactory"></param> /// <returns></returns> public static IUnityContainer WithActor <TActor, TActorService>( this IUnityContainer container, Func <IUnityContainer, StatefulServiceContext, ActorTypeInformation, Func <ActorService, ActorId, TActor>, TActorService> ActorServiceFactory) where TActor : ActorBase where TActorService : ActorService { //var logger = container.Resolve<ILoggerFactory>().CreateLogger<TActor>(); //logger.LogInformation("Registering Actor {ActorName}", typeof(TActor).Name); // container = container.IntializeScope(); if (!container.IsRegistered <IActorDeactivationInterception>()) { container.RegisterType <IActorDeactivationInterception, OnActorDeactivateInterceptor>(new HierarchicalLifetimeManager()); } container.RegisterType(typeof(TActor), ActorProxyTypeFactory.CreateType <TActor>(), new HierarchicalLifetimeManager()); ActorRuntime.RegisterActorAsync <TActor>((context, actorType) => { try { var serviceContainer = container.IntializeScope(); return(ActorServiceFactory(serviceContainer, context, actorType, (service, id) => serviceContainer .IntializeScope() .RegisterInstance(service.Context.CodePackageActivationContext, new ExternallyControlledLifetimeManager()) .RegisterInstance(service, new ExternallyControlledLifetimeManager()) // .RegisterInstance(service as TActorService, new ExternallyControlledLifetimeManager()) .RegisterInstance(id, new ContainerControlledLifetimeManager()).Resolve <TActor>())); } catch (Exception ex) { // logger.LogCritical(new EventId(100, "FailedToCreateActorService"), ex, "Failed to create ActorService for {ActorName}", typeof(TActor).Name); throw; } }).GetAwaiter().GetResult(); return(container); }