Exemple #1
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);
        }
Exemple #2
0
        /// <summary>
        /// Create actor from either lambda or activator
        /// </summary>
        /// <typeparam name="T">actor interface</typeparam>
        /// <param name="context">context</param>
        /// <param name="actorKey">actor key</param>
        /// <param name="manager">actor manager</param>
        /// <returns>instance of actor implementation</returns>
        public T Create <T>(IWorkContext context, ActorKey actorKey, IActorManager manager) where T : IActor
        {
            context.Verify(nameof(context)).IsNotNull();
            actorKey.Verify(nameof(actorKey)).IsNotNull();
            manager.Verify(nameof(manager)).IsNotNull();

            typeof(T).IsInterface.Verify().Assert(x => x == true, $"{typeof(T)} must be an interface");
            context = context.With(_tag);

            Type actorType = typeof(T);

            ActorTypeRegistration?typeRegistration = GetTypeRegistration(actorType) ?? GetTypeFromDi(context, actorType);

            if (typeRegistration == null)
            {
                var ex = new KeyNotFoundException($"Registration for {actorType.FullName} was not found");
                context.Telemetry.Error(context.With(_tag), "create failure", ex);
                throw ex;
            }

            IActor actorObject = typeRegistration.CreateImplementation(context);

            // Set actor key and manager
            ActorBase?actorBase = actorObject as ActorBase;

            if (actorBase == null)
            {
                string failureMsg = $"Created actor type {actorObject.GetType()} does not derive from ActorBase";
                context.Telemetry.Error(context.With(_tag), failureMsg);
                throw new InvalidOperationException(failureMsg);
            }

            actorBase.ActorKey     = actorKey;
            actorBase.ActorManager = manager;
            actorBase.ActorType    = actorType;

            return((T)actorObject);
        }
 public RouteManager(IActorManager actorManager)
 {
     actorManager.Verify(nameof(actorManager)).IsNotNull();
     _actorManager = actorManager;
 }