/// <summary>
 /// Gets the repository.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <returns>The entity repository.</returns>
 public EntityRepositoryBase GetRepository(CRMSecurityProvider.Configuration.ConfigurationSettings settings)
 {
     return(this.Resolve <EntityRepositoryBase>(settings));
 }
        /// <summary>
        /// Parses the specified connection string.
        /// </summary>
        /// <param name="connectionString">The connection string.</param>
        /// <returns>The configuration settings.</returns>
        public static ConfigurationSettings Parse(string connectionString)
        {
            Assert.ArgumentNotNullOrEmpty(connectionString, "connectionString");

            if (!connectionString.StartsWith("crm:", StringComparison.InvariantCultureIgnoreCase))
            {
                throw new NotSupportedException("Connection string is not supported: " + connectionString);
            }

            connectionString = connectionString.Substring(4);
            var connectionValues = StringUtil.GetNameValues(connectionString, '=', ';');

            var settings = new ConfigurationSettings();

            settings.Url = connectionValues["url"];
            if (String.IsNullOrEmpty(settings.Url))
            {
                throw new NotSupportedException("Connection string without 'url' is not supported.");
            }
            settings.Url = settings.Url.ToLower();

            settings.User = connectionValues["user id"];
            if (String.IsNullOrEmpty(settings.User))
            {
                throw new NotSupportedException("Connection string without 'user id' is not supported.");
            }

            settings.Password = connectionValues["password"];
            if (String.IsNullOrEmpty(settings.Password))
            {
                throw new NotSupportedException("Connection string without 'password' is not supported.");
            }

            settings.Organization = connectionValues["organization"];
            if (String.IsNullOrEmpty(settings.Organization))
            {
                throw new NotSupportedException("Connection string without 'organization' is not supported.");
            }

            if (settings.Url.Contains("/2006/"))
            {
                settings.ApiVersion = ApiVersion.V3;
            }
            else if (settings.Url.Contains("/2007/"))
            {
                settings.ApiVersion = ApiVersion.V4;
            }
            else if (settings.Url.Contains("/2011/"))
            {
                settings.ApiVersion = ApiVersion.V5;
            }
            else
            {
                throw new NotSupportedException("Connection string is not supported: " + connectionString);
            }

            var stringAuthenticationType = connectionValues["authentication type"];

            if (String.IsNullOrEmpty(stringAuthenticationType))
            {
                throw new NotSupportedException("Connection string without 'authentication type' is not supported.");
            }
            int authenticationType;

            if (!Int32.TryParse(stringAuthenticationType, out authenticationType))
            {
                throw new ArgumentException("Connection string contains wrong 'authentication type'.");
            }
            settings.AuthenticationType = (AuthenticationType)authenticationType;

            settings.Partner     = connectionValues["partner"] ?? String.Empty;
            settings.Environment = connectionValues["environment"] ?? String.Empty;
            settings.UnsafeAuthenticatedConnectionSharing = MainUtil.GetBool(connectionValues["unsafeauthenticatedconnectionsharing"], true);
            settings.PreAuthenticate = MainUtil.GetBool(connectionValues["preauthenticate"], true);

            return(settings);
        }