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);
        }