Ctripのアポロ伝統的な.NET Configuration Centerのプロジェクトに統合練習

公式文書の問題があります

アポロは非標準で書かれた文書のリズムセクションに追いつくために、関連するドキュメントで、その結果、更新されているクライアントのソースコード配布センターが原因である可能性があり、誤解を招く初心者の友人をドッキングさせることは容易です。

例えば、私は、彼はいくつかの問題を発見したときに実行するために、従来の.NETクライアント・アクセスを使用して、次の二つの文書を参照してください。

  1. アプリケーションIDの識別上の2つの文書AppIdに矛盾構成ノード。

  2. パブリッシング環境のための第二のアプリケーションコンフィギュレーションマニュアルEnvironment構成ノードを説明重大なエラー。

もちろん、これらの問題は、いつでも修理される可能性が高いです。あなたが表示された場合、本明細書に記述された文書の内容と一致していない、公式ドキュメントを参照してください。

従来の高速アクセス.NETプロジェクト

ビジネスへのクイック。

インストールの依存関係

NuGetパッケージマネージャによって、プロジェクトのインフラストラクチャ層でまたは従来の.NETプロジェクトを使用してクライアントを追加するには、次のコマンドを使用します。

Install-Package Com.Ctrip.Framework.Apollo.ConfigurationManager -Version 2.0.3

何が上記のパッケージ名から見ることができますか?私はここにあるオプションである2.0.3バージョン、より明白で、これは名前からJavaerであるということです。

&アドレスサービスを識別するためのアプリケーションを設定

スタートアッププロジェクトでは、オープンApp.configまたはWeb.configコンフィギュレーションファイルには、<appSettings>次のノードのノードを追加します。

<!-- Change to the actual app id -->
<add key="Apollo.AppID" value="R01001" />
<add key="Apollo.MetaServer" value="http://localhost:8080" />

あなたが複数のセット構成サービスを展開する場合、以下の構成を参照してください、マルチ環境をサポートしています。

<!-- Change to the actual app id -->
<add key="Apollo.AppID" value="R01001" />

<!-- Should change the apollo config service url for each environment -->
<add key="Apollo.Env" value="DEV" />
<add key="Apollo.DEV.Meta" value="http://localhost:8080"/>
<add key="Apollo.FAT.Meta" value="http://localhost:8081"/>
<add key="Apollo.UAT.Meta" value="http://localhost:8082"/>
<add key="Apollo.PRO.Meta" value="http://localhost:8083"/>

設定が完了すると、あなたは我々のクライアントのアポロ・プロジェクトを使用する準備が整いました。

二次パッケージコード

私たちは、パッケージの層は、このパッケージが浅い場合、一般的に、インフラストラクチャ層でプロジェクトを行い、プロジェクト内でサードパーティのライブラリを使用するために使用されるので、再度、依存関係を導入する他の層を使用する必要はありません。

直接コードに、言ってはいけません。

次のようにコードの構造は次のようになります。

├─MyCompany.MyProject.Infrastructure         # 项目基础设施层
│  │                                                       
│  └─Configuration                         
│          ApolloConfiguration.cs            # Apollo 分布式配置项读取实现     
│          ConfigurationChangeEventArgs.cs   # 配置更改回调事件参数
│          IConfiguration.cs                 # 配置抽象接口,可基于此接口实现本地配置读取

IConfiguration

using System;
using System.Configuration;

namespace MyCompany.MyProject.Infrastructure
{
    /// <summary>
    /// 配置抽象接口。
    /// </summary>
    public interface IConfiguration
    {
        /// <summary>
        /// 配置更改回调事件。
        /// </summary>
        event EventHandler<ConfigurationChangeEventArgs> ConfigChanged;

        /// <summary>
        /// 获取配置项。
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="namespaces">命名空间集合</param>
        /// <returns></returns>
        string GetValue(string key, params string[] namespaces);

        /// <summary>
        /// 获取配置项。
        /// </summary>
        /// <typeparam name="TValue">值类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="namespaces">命名空间集合</param>
        /// <returns></returns>
        TValue GetValue<TValue>(string key, params string[] namespaces);

        /// <summary>
        /// 获取配置项,如果值为 <see cref="null"/> 则取参数 <see cref="defaultValue"/> 值。
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="defaultValue">默认值</param>
        /// <param name="namespaces">命名空间集合</param>
        /// <returns></returns>
        string GetDefaultValue(string key, string defaultValue, params string[] namespaces);

        /// <summary>
        /// 获取配置项,如果值为 <see cref="null"/> 则取参数 <see cref="defaultValue"/> 值。
        /// </summary>
        /// <typeparam name="TValue">值类型</typeparam>
        /// <param name="key">键</param>
        /// <param name="defaultValue">默认值</param>
        /// <param name="namespaces">命名空间集合</param>
        /// <returns></returns>
        TValue GetDefaultValue<TValue>(string key, TValue defaultValue, params string[] namespaces);
    }
}

ConfigurationChangeEventArgs

using Com.Ctrip.Framework.Apollo.Model;
using System.Collections.Generic;

namespace MyCompany.MyProject.Infrastructure
{
    public class ConfigurationChangeEventArgs
    {
        public IEnumerable<string> ChangedKeys => Changes.Keys;
        public bool IsChanged(string key) => Changes.ContainsKey(key);
        public string Namespace { get; }
        public IReadOnlyDictionary<string, ConfigChange> Changes { get; }
        public ConfigurationChangeEventArgs(string namespaceName, IReadOnlyDictionary<string, ConfigChange> changes)
        {
            Namespace = namespaceName;
            Changes = changes;
        }
        public ConfigChange GetChange(string key)
        {
            Changes.TryGetValue(key, out var change);
            return change;
        }
    }
}

ApolloConfiguration

using System;
using System.Configuration;
using System.Globalization;
using Com.Ctrip.Framework.Apollo;
using Com.Ctrip.Framework.Apollo.Model;

namespace MyCompany.MyProject.Infrastructure
{
    public class ApolloConfiguration : IConfiguration
    {
        private readonly string _defaultValue = null;

        public event EventHandler<ConfigurationChangeEventArgs> ConfigChanged;

        private IConfig GetConfig(params string[] namespaces)
        {
            var config = namespaces == null || namespaces.Length == 0 ?
                ApolloConfigurationManager.GetAppConfig().GetAwaiter().GetResult() :
                ApolloConfigurationManager.GetConfig(namespaces).GetAwaiter().GetResult();

            config.ConfigChanged += (object sender, ConfigChangeEventArgs args) =>
            {
                ConfigChanged(sender, new ConfigurationChangeEventArgs(args.Namespace, args.Changes));
            };

            return config;
        }

        public string GetValue(string key, params string[] namespaces)
        {
            key = key ?? throw new ArgumentNullException(nameof(key));
            var config = GetConfig(namespaces);
            return config.GetProperty(key, _defaultValue);
        }

        public TValue GetValue<TValue>(string key, params string[] namespaces)
        {
            var value = GetValue(key, namespaces);
            return value == null ?
                default(TValue) :
                (TValue)Convert.ChangeType(value, typeof(TValue), CultureInfo.InvariantCulture);
        }

        public string GetDefaultValue(string key, string defaultValue, params string[] namespaces)
        {
            key = key ?? throw new ArgumentNullException(nameof(key));
            var config = GetConfig(namespaces);
            return config.GetProperty(key, defaultValue);
        }

        public TValue GetDefaultValue<TValue>(string key, TValue defaultValue, params string[] namespaces)
        {
            var value = GetDefaultValue(key, defaultValue, namespaces);
            return value == null ?
                default(TValue) :
                (TValue)Convert.ChangeType(value, typeof(TValue), CultureInfo.InvariantCulture);
        }
    }
}

使用

在使用之前需要先把ApolloConfiguration注册到应用容器中,请参考如下代码:

// 这里我们项目使用的 DI 框架是`Autofac`,按需修改吧,记得将实例注册成单例模式。
public class DependencyRegistrar : IDependencyRegistrar
{
    public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
    {
        
        builder.RegisterType<ApolloConfiguration>()
            .As<IConfiguration>()
            .Named<IConfiguration>("configuration")
            .SingleInstance();
            
        ...
    }

    public int Order
    {
        get { return 1; }
    }
}

接下来就可以在项目中使用了,请参考如下代码:

public class UserController : BaseController
{
    private readonly IConfiguration _configuration;

    public UserController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    
    public ActionResult Add(AddUserInput model)
    {
        if (ModelState.IsValid)
        {
            // 从 Apollo 分布式配置中心 项目`R01001` 默认命名空间`application`下 读取配置项。
            model.Password = _configuration.GetValue("DefaultUserPassword");
            ...
        }
        ...
    }
}

おすすめ

転載: www.cnblogs.com/esofar/p/11310921.html