Beispiel #1
0
        //private Semaphore mSemaphoreListener = null;

        //private int mClosedLevel = 0;

        //private bool mListening = false;

        #endregion

        #region Constructor(s)

        /// <summary>
        /// Initializes the <see cref="ProxyFactory&lt;TContract&gt;"/> class.
        /// </summary>
        static ProxyFactory()
        {
            ProxyServices.Initialize();
        }
Beispiel #2
0
        public static void Initialize()
        {
            if (!mInitialized)
            {
                Raiser.CallDelegatorBySync(EventInitialization, new object[] { null, new ServiceInitializationStateEventArgs(ServiceInitializationStateEnum.Before) });
                ChannelServices.Initialize();
                if (LOGGER.IsInfoEnabled)
                {
                    LOGGER.Info("Initializing client proxy services.");
                }

                CategoryPropertyItem pi = ConfigurationAccessHelper.GetCategoryPropertyByPath(RemotingConfiguration.Settings.CategoryPropertyItems, "Clients");
                if (pi != null)
                {
                    try
                    {
                        IEnumerator <CategoryPropertyItem> iterator = pi.GetEnumerator();
                        while (iterator.MoveNext())
                        {
                            pi = iterator.Current;
                            if (string.IsNullOrEmpty(pi.Id))
                            {
                                throw new InvalidConfigurationException("Contract type not definied. Empty item found in configuration.");
                            }
                            Type   contractType     = null;
                            String defaultChannelId = null;
                            Type   defaultProxyType = null;

                            try
                            {
                                contractType = TypeHelper.GetTypeFromString(pi.Id);
                                if (mContractDescriptors.ContainsKey(contractType))
                                {
                                    throw new InvalidConfigurationException(String.Format("Duplicated contract type configuration found in clients. Contract: {0}", contractType.FullName));
                                }
                                ContractValidator.ValidateContractIntegrity(contractType);
                            }
                            catch (Exception ex)
                            {
                                throw new InvalidConfigurationValueException(String.Format("Unable to resolve contract type: {0}", pi.Id), ex);
                            }

                            {
                                CategoryPropertyItem defaultChannelIdPropertyItem = ConfigurationAccessHelper.GetCategoryPropertyByPath(RemotingConfiguration.Settings.CategoryPropertyItems, String.Format("Clients/{0}/Defaults/DefaultChannelId", pi.Id));
                                if (defaultChannelIdPropertyItem != null)
                                {
                                    defaultChannelId = defaultChannelIdPropertyItem.EntryValue;
                                    if (string.Empty.Equals(defaultChannelId))
                                    {
                                        defaultChannelId = null;
                                    }
                                }
                            }

                            {
                                CategoryPropertyItem defaultProxyTypePropertyItem = ConfigurationAccessHelper.GetCategoryPropertyByPath(RemotingConfiguration.Settings.CategoryPropertyItems, String.Format("Clients/{0}/Defaults/DefaultProxyType", pi.Id));
                                if (defaultProxyTypePropertyItem != null)
                                {
                                    if (defaultProxyTypePropertyItem.EntryValue != null && !string.Empty.Equals(defaultProxyTypePropertyItem.EntryValue))
                                    {
                                        try
                                        {
                                            defaultProxyType = TypeHelper.GetTypeFromString(defaultProxyTypePropertyItem.EntryValue);
                                            ImplementationValidator.ValidateProxyIntegration(defaultProxyType);
                                        }
                                        catch (Exception ex)
                                        {
                                            throw new InvalidConfigurationValueException(String.Format("Unable to resolve proxy type: {0} for contract: {1}", defaultProxyTypePropertyItem.EntryValue, pi.Id), ex);
                                        }
                                    }
                                }
                            }
                            if (!(defaultChannelId == null && defaultProxyType == null))
                            {
                                if (defaultChannelId == null || defaultProxyType == null)
                                {
                                    throw new InvalidConfigurationException(String.Format("Both of 'DefaultChannelId' and 'DefaultProxyType' values are must be filled in configuration. Contract type: {0}", pi.Id));
                                }
                                if (!contractType.IsAssignableFrom(defaultProxyType))
                                {
                                    throw new InvalidProxyImplementationException(String.Format("Provided default proxy type '{0}' does not implement contract interface '{1}'.", defaultProxyType.FullName, contractType.FullName));
                                }
                            }

                            ContractClientSideDescriptor descriptor = new ContractClientSideDescriptor(contractType, defaultChannelId, defaultProxyType);

                            {
                                CategoryPropertyItem customDefinitionsPropertyItem = ConfigurationAccessHelper.GetCategoryPropertyByPath(RemotingConfiguration.Settings.CategoryPropertyItems, String.Format("Clients/{0}/CustomDefinitions", pi.Id));
                                if (customDefinitionsPropertyItem != null)
                                {
                                    IEnumerator <CategoryPropertyItem> customDefinitionsIterator = customDefinitionsPropertyItem.GetEnumerator();
                                    while (customDefinitionsIterator.MoveNext())
                                    {
                                        CategoryPropertyItem channelProxyItem = customDefinitionsIterator.Current;
                                        if (string.IsNullOrEmpty(channelProxyItem.Id))
                                        {
                                            throw new InvalidConfigurationValueException(String.Format("Channel identifier is missing from a configuration item at the CustomDefinitions of the contract '{0}'", pi.Id));
                                        }
                                        if (string.IsNullOrEmpty(channelProxyItem.EntryValue))
                                        {
                                            throw new InvalidConfigurationValueException(String.Format("Proxy type is missing from a configuration item at the CustomDefinitions of the contract '{0}'", pi.Id));
                                        }
                                        if (!ChannelServices.IsChannelRegistered(channelProxyItem.Id))
                                        {
                                            throw new InvalidConfigurationValueException(String.Format("Unregistered channel provided '{0}' in CustomDefinitions configuration section of the contract: {1}.", channelProxyItem.Id, pi.Id));
                                        }
                                        Type type = null;
                                        try
                                        {
                                            type = TypeHelper.GetTypeFromString(channelProxyItem.EntryValue);
                                            if (!contractType.IsAssignableFrom(type))
                                            {
                                                throw new InvalidProxyImplementationException(String.Format("Provided proxy type '{0}' does not implement contract interface '{1}'.", type.FullName, contractType.FullName));
                                            }
                                            ImplementationValidator.ValidateProxyIntegration(type);
                                        }
                                        catch (Exception ex)
                                        {
                                            throw new InvalidConfigurationValueException(String.Format("Unable to resolve non-default proxy type: {0} for contract: {1} for the channel: {2}", channelProxyItem.EntryValue, pi.Id, channelProxyItem.Id), ex);
                                        }
                                        if (descriptor.ImplementationPerChannel.ContainsKey(channelProxyItem.Id))
                                        {
                                            throw new InvalidConfigurationException(String.Format("Duplicated channel identifier in CustomDefinitions section at contract '{0}'.", pi.Id));
                                        }
                                        descriptor.ImplementationPerChannel.Add(channelProxyItem.Id, type);
                                    }
                                }
                            }
                            mContractDescriptors.Add(contractType, descriptor);
                        }
                        mSingletonInstance = new ProxyServices();
                        //if (mContractDescriptors.Count > 0)
                        //{
                        //    mSingletonInstance = new ProxyServices();
                        //}
                    }
                    catch (Exception ex)
                    {
                        mContractDescriptors.Clear();
                        throw ex;
                    }
                }
                //ChannelServices.startListeningChannels();

                mInitialized = true;
                if (LOGGER.IsInfoEnabled)
                {
                    LOGGER.Info("Client proxy services successfully initialized.");
                }
                Raiser.CallDelegatorBySync(EventInitialization, new object[] { null, new ServiceInitializationStateEventArgs(ServiceInitializationStateEnum.After) });
            }
        }