private static object CreateCommandServiceObject(
            CommandsInvokationEvaluator commandInvokationEvaluator,
            Type serviceType,
            IOptimizationPackage optPack)
        {
            var serviceObjectType = default(Type);

            if (optPack.typeContainer.Contains($"{serviceType}_Dispatcher"))
            {
                serviceObjectType = optPack.typeContainer.Get($"{serviceType}_Dispatcher");
            }
            else
            {
                var moduleBuilder = ModuleBuilderProvider.GetModuleBuilder();

                var serviceObjectTypeBuilder = DynamicTypeBuilderFactory.CreateClassBuilder(
                    $"{serviceType}_Dispatcher",
                    new Dictionary <string, Type>(),
                    moduleBuilder,
                    serviceType, typeof(IDisposable));

                serviceObjectType = serviceObjectTypeBuilder.Build();

                optPack.typeContainer.Save(serviceObjectType);
            }

            var serviceObject = Activator.CreateInstance(serviceObjectType, commandInvokationEvaluator);

            return(serviceObject);
        }
        public static object CreateCommandService(
            Type serviceType,
            IProxyContainer proxyContainer,
            IOptimizationPackage optPack)
        {
            var connectedProxy    = ProxyFactory.CreateConnectedCommandProxy(serviceType, optPack);
            var disconnectedProxy = ProxyFactory.CreateDisconnectedCommandProxy(serviceType, optPack);

            proxyContainer.AddProxyObject(connectedProxy);
            proxyContainer.AddProxyObject(disconnectedProxy);

            var commandInvokationEvaluator = new CommandsInvokationEvaluator(connectedProxy, disconnectedProxy);

            return(CreateCommandServiceObject(commandInvokationEvaluator, serviceType, optPack));
        }