Example #1
0
        /// <summary>
        /// Get actor, if already exist, will return or create new one
        /// </summary>
        /// <typeparam name="T">actor type</typeparam>
        /// <param name="actorKey">actor key</param>
        /// <returns>actor instance</returns>
        public T GetActor <T>(ActorKey actorKey) where T : IActor
        {
            actorKey.VerifyNotNull(nameof(actorKey));

            Type actoryType = typeof(T);

            lock (_lock)
            {
                if (_actorCollection.TryGetValue(actoryType, actorKey, out ActorInstance actorInstance))
                {
                    _logger.LogInformation($"{nameof(GetActor)}: found instance, actorKey={actorKey}, actorInstance.ActorKey={actorInstance.ActorKey}");
                    return((T)actorInstance.GetInstance <T>());
                }

                // Create actor object
                IActorBase actorBase = _registry.Create <T>(actorKey, this);
                (actorKey == actorBase.ActorKey).VerifyAssert(x => x, $"{nameof(GetActor)}: CREATED-Error  Actor key !=, actorKey={actorKey}, actorBase.ActorKey={actorBase.ActorKey}");
                _logger.LogTrace($"{nameof(GetActor)}: CREATED actorBase.ActorKey={actorBase.ActorKey}");

                // Create proxy
                T actorInterface = ActorProxy <T> .Create(actorBase, this);

                actorInstance = new ActorInstance(typeof(T), actorKey, actorBase, actorInterface);

                // Add to actor collection
                _actorCollection.Set(actorInstance);

                // Create proxy for interface
                return(actorInstance.GetInstance <T>());
            }
        }
Example #2
0
        /// <summary>
        /// Get actor, if already exist, will return or create new one
        /// </summary>
        /// <typeparam name="T">actor type</typeparam>
        /// <param name="actorKey">actor key</param>
        /// <returns>actor instance</returns>
        public T GetActor <T>(ActorKey actorKey) where T : IActor
        {
            actorKey.VerifyNotNull(nameof(actorKey));

            Type actoryType = typeof(T);

            lock (_lock)
            {
                if (_actorCollection.TryGetValue(actoryType, actorKey, out ActorInstance actorInstance))
                {
                    return((T)actorInstance.GetInstance <T>());
                }

                // Create actor object
                IActorBase actorBase = _registry.Create <T>(actorKey, this);

                // Create proxy
                T actorInterface = ActorProxy <T> .Create(actorBase, this);

                actorInstance = new ActorInstance(typeof(T), actorKey, actorBase, actorInterface);

                // Add to actor collection
                _actorCollection.Set(actorInstance);

                // Create proxy for interface
                return(actorInstance.GetInstance <T>());
            }
        }
Example #3
0
        /// <summary>
        /// Dispose
        /// </summary>
        public void Dispose()
        {
            ActorProxy = null;

            IActorBase current = Interlocked.Exchange(ref _instance, null);

            current?.Dispose();
        }
Example #4
0
 public GameRoom(IMapActor map, IActorBase illumination, IEnemyManager enemyManager,
                 IPlayerManager playerManager)
 {
     _map           = map;
     _illumination  = illumination;
     _enemyManager  = enemyManager;
     _playerManager = playerManager;
 }
Example #5
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="actorType">actor type</param>
        /// <param name="actorKey">actor key</param>
        /// <param name="instance">instance of the actor class</param>
        /// <param name="actorProxy">actor proxy</param>
        public ActorRegistration(Type actorType, ActorKey actorKey, IActorBase instance, IActor actorProxy)
        {
            Verify.IsNotNull(nameof(actorType), actorType);
            Verify.IsNotNull(nameof(actorKey), actorKey);
            Verify.IsNotNull(nameof(instance), instance);
            Verify.IsNotNull(nameof(actorProxy), actorProxy);

            ActorType  = actorType;
            ActorKey   = actorKey;
            _instance  = instance;
            ActorProxy = actorProxy;
        }
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="actorType">actor type</param>
        /// <param name="actorKey">actor key</param>
        /// <param name="instance">instance of the actor class</param>
        /// <param name="actorProxy">actor proxy</param>
        public ActorRegistration(Type actorType, ActorKey actorKey, IActorBase instance, IActor actorProxy)
        {
            actorType.Verify(nameof(actorType)).IsNotNull();
            actorKey.Verify(nameof(actorKey)).IsNotNull();
            instance.Verify(nameof(instance)).IsNotNull();
            actorProxy.Verify(nameof(actorProxy)).IsNotNull();

            ActorType   = actorType;
            ActorKey    = actorKey;
            _instance   = instance;
            _actorProxy = actorProxy;
        }
Example #7
0
        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="actorType">actor type</param>
        /// <param name="actorKey">actor key</param>
        /// <param name="instance">instance of the actor class</param>
        /// <param name="actorProxy">actor proxy</param>
        public ActorInstance(Type actorType, ActorKey actorKey, IActorBase instance, IActor actorProxy)
        {
            actorType.VerifyNotNull(nameof(actorType));
            actorKey.VerifyNotNull(nameof(actorKey));
            instance.VerifyNotNull(nameof(instance));
            actorProxy.VerifyNotNull(nameof(actorProxy));

            ActorType   = actorType;
            ActorKey    = actorKey;
            _instance   = instance;
            _actorProxy = actorProxy;
        }
Example #8
0
        private ActorProxy(IActorBase instance, IActorManager manager)
            : base(typeof(T))
        {
            Verify.IsNotNull(nameof(instance), instance);
            Verify.IsNotNull(nameof(manager), manager);

            _instance = instance;
            _manager  = manager;

            _workContext = new WorkContextBuilder()
                           .Set(_tag)
                           .Set(_cv)
                           .Build();
        }
Example #9
0
        /// <summary>
        /// Create transparent proxy for instance of actor class
        /// </summary>
        /// <param name="context">work context</param>
        /// <param name="instance">instance of actor class</param>
        /// <param name="manager">actor manager</param>
        /// <returns>proxy</returns>
        public static T Create(IActorBase instance, ActorHost actorHost)
        {
            instance.VerifyNotNull(nameof(instance));
            actorHost.VerifyNotNull(nameof(actorHost));

            object proxyObject = Create <T, ActorProxy <T> >();

            ActorProxy <T> proxy = (ActorProxy <T>)proxyObject;

            proxy._instance  = instance;
            proxy._actorHost = actorHost;

            return((T)proxyObject);
        }
Example #10
0
        /// <summary>
        /// Create transparent proxy for instance of actor class
        /// </summary>
        /// <param name="context">work context</param>
        /// <param name="instance">instance of actor class</param>
        /// <param name="manager">actor manager</param>
        /// <returns>proxy</returns>
        public static T Create(IWorkContext context, IActorBase instance, IActorManager manager)
        {
            context.Verify(nameof(context)).IsNotNull();
            instance.Verify(nameof(instance)).IsNotNull();
            manager.Verify(nameof(manager)).IsNotNull();

            object proxyObject = Create <T, ActorProxy <T> >();

            ActorProxy <T> proxy = (ActorProxy <T>)proxyObject;

            proxy._instance = instance;
            proxy._manager  = manager;

            proxy._workContext = new WorkContextBuilder(context)
                                 .Set(_tag)
                                 .Set(_cv)
                                 .Build();

            return((T)proxyObject);
        }
Example #11
0
        /// <summary>
        /// Create virtual actor, return current instance or create one
        /// </summary>
        /// <typeparam name="T">actor interface</typeparam>
        /// <param name="context">context</param>
        /// <param name="actorKey">actor key</param>
        /// <returns>actor proxy interface</returns>
        public async Task <T> CreateProxyAsync <T>(IWorkContext context, ActorKey actorKey) where T : IActor
        {
            Verify.Assert(IsRunning, _disposedTestText);

            Verify.IsNotNull(nameof(context), context);
            Verify.IsNotNull(nameof(context), context);
            Verify.IsNotNull(nameof(actorKey), actorKey);
            context = context.WithTag(_tag);

            Type actorType = typeof(T);

            // Lookup instance of actor (type + actorKey)
            IActorRegistration actorRegistration = _actorRepository.Lookup(actorType, actorKey);

            if (actorRegistration != null)
            {
                return(actorRegistration.GetInstance <T>());
            }

            // Create actor
            IActor actorObject = _typeManager.Create <T>(context, actorKey, this);

            IActorBase actorBase = actorObject as IActorBase;

            if (actorBase == null)
            {
                var ex = new ArgumentException($"Actor {actorObject.GetType().FullName} does not implement IActorBase");
                Configuration.WorkContext.EventLog.Error(context, "Cannot create", ex);
                throw ex;
            }

            T actorInterface = ActorProxy <T> .Create(context, actorBase, this);

            actorRegistration = new ActorRegistration(typeof(T), actorKey, actorBase, actorInterface);

            await _actorRepository.SetAsync(context, actorRegistration);

            // Create proxy for interface
            return(actorRegistration.GetInstance <T>());
        }
Example #12
0
 /// <summary>
 /// Create transparent proxy for instance of actor class
 /// </summary>
 /// <param name="instance">instance of actor class</param>
 /// <param name="manager">actor manager</param>
 /// <returns>proxy</returns>
 public static T Create(IActorBase instance, IActorManager manager)
 {
     return((T) new ActorProxy <T>(instance, manager).GetTransparentProxy());
 }