public void ListenForEvents(ServiceEnvironmentEventType eventType)
        {
            if (_eventListener == null)
            {
                _eventListener = new WcfHost(this, this);

                ServiceEndpoint[] rawEndpoints = _eventListener.Description.Endpoints.ToArray();
                _eventListener.Description.Endpoints.Clear();
                foreach (ServiceEndpoint endpoint in rawEndpoints)
                {
                    endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{guid}", Guid.NewGuid().ToString("N"))));
                    _eventListener.AddServiceEndpoint(endpoint);
                }

                _eventListener.Open();
            }

            var env = this.EnvironmentConfiguration;

            using (var connection = new SqlConnection(env.ConnectionString))
            {
                // FUTURE: in the future save all endpoints to DB
                var command = new SqlCommand(env.SP_EnvironmentEventRegister, connection);
                command.CommandType = CommandType.StoredProcedure;
                command.Parameters.AddWithValue("@eventType", eventType.ToString());
                command.Parameters.AddWithValue("@endpointName", _eventListener.Description.Endpoints.First(endpoint => endpoint.Name == typeof(ServiceEnvironment).FullName).Name);
                command.Parameters.AddWithValue("@endpointAddress", _eventListener.Description.Endpoints.First(endpoint => endpoint.Name == typeof(ServiceEnvironment).FullName).Address.ToString());
                connection.Open();
                command.ExecuteNonQuery();
            }
        }
        // ========================
        #endregion

        #region Methods
        // ========================

        public ServiceExecutionHost(string name, ServiceEnvironment environment)
        {
            ServiceExecutionPermission.All.Demand();

            this.HostName    = name;
            this.HostGuid    = Guid.NewGuid();
            this.Environment = environment;

            this.WcfHost = new WcfHost(this.Environment, this);

            ServiceEndpoint[] rawEndpoints = this.WcfHost.Description.Endpoints.ToArray();
            this.WcfHost.Description.Endpoints.Clear();
            foreach (ServiceEndpoint endpoint in rawEndpoints)
            {
                endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{hostName}", name)));
                this.WcfHost.AddServiceEndpoint(endpoint);
            }

            this.Environment.RegisterHost(this);

            // Open the listener
            WcfHost.Open();

            // Start the logger
            Edge.Core.Utilities.Log.Start();

            #region Code Access Security (disabled)

            /*
             *
             * // Move following line outside this function
             * // PermissionSet _servicePermissions;
             *
             * _servicePermissions = new PermissionSet(PermissionState.None);
             * _servicePermissions.AddPermission(new ServiceExecutionPermission(ServiceExecutionPermissionFlags.None));
             * _servicePermissions.AddPermission(new System.Security.Permissions.FileIOPermission(PermissionState.Unrestricted));
             * _servicePermissions.AddPermission(new System.Security.Permissions.ReflectionPermission(PermissionState.Unrestricted));
             * _servicePermissions.AddPermission(new System.Security.Permissions.SecurityPermission(
             *      SecurityPermissionFlag.Assertion |
             *      SecurityPermissionFlag.Execution |
             *      SecurityPermissionFlag.ControlAppDomain |
             *      SecurityPermissionFlag.ControlThread |
             *      SecurityPermissionFlag.SerializationFormatter
             * ));
             */
            #endregion
        }
        // ------------------------------

        internal ServiceEnvironmentEventListener(ServiceEnvironment environment, ServiceEnvironmentEventType[] eventTypes)
        {
            this.ListenerID  = Guid.NewGuid();
            this.Environment = environment;
            this.EventTypes  = eventTypes;
            this.WcfHost     = new WcfHost(environment, this);

            ServiceEndpoint[] rawEndpoints = WcfHost.Description.Endpoints.ToArray();
            WcfHost.Description.Endpoints.Clear();
            foreach (ServiceEndpoint endpoint in rawEndpoints)
            {
                endpoint.Address = new EndpointAddress(new Uri(endpoint.Address.Uri.ToString().Replace("{guid}", this.ListenerID.ToString("N"))));
                WcfHost.AddServiceEndpoint(endpoint);
            }

            WcfHost.Open();
        }