焼き込みアセンブリの設定をラップする設定サービスがありますが、コマンドラインでこれらの設定を上書きしたいと思います。 現在、このコードが正常に動作している:私はコマンドライン文字列を使用して設定を上書きすることができますので、jsonをインタフェースにデシリアライズする簡潔な方法は?
class Program
{
static void Main(string[] args)
{
ISettings opSettings = new OperationalSettings();
var commandLineTest = "{Url:'http://overridenurl.com'}";
ISettings commandSettings = new CommandLineSettings(commandLineTest);
var configService = new ConfigService(opSettings);
var configServiceUsingCmdOpts = new ConfigService(commandSettings);
}
}
これで:
public interface ISettings
{
string Url { get; }
}
public class OperationalSettings : ISettings
{
public string Url { get { return ServiceSettings.Default.Url; } }
}
public class CommandLineModel
{
public string Url;
}
public class CommandLineSettings : ISettings
{
private readonly CommandLineModel _model;
public CommandLineSettings(string serialisedSettings)
{
_model = JsonConvert.DeserializeObject<CommandLineModel>(serialisedSettings);
}
public string Url { get { return _model.Url; } }
}
public class ConfigService
{
private readonly ISettings _settings;
public ConfigService(ISettings settings)
{
_settings = settings;
}
public ISettings settings { get { return _settings; } }
}
そして、テストドライバコードを。しかし、私が好きではないことは、私は新しい設定を持っている場合、私は今、4ヶ所でこれを追加する必要があるということです。
- インタフェース
- 設定ラッパー(OperationalSettings)の具体的な実装
- デシリアライズのコマンドラインモデル
- デシリアライズされたモデルをラップするコマンドライン設定の実装。
さらにプロパティを追加すると、スケーラビリティに問題があるようです。多くのコードを変更することなくこれを達成するより効率的な方法がありますか?
を使用するには、ここ
ExpandoObject
クラスを使用し、静的メンバを持っていませんps://msdn.microsoft.com/en-us/library/ee461504.aspx –
@BRAHIMKamel私はCommandLineModelを動的にスワップしましたが、これはうまくいくようです。これは唯一の解決策ですか? – user183872
私の答えを見てくださいあなたのケースで便利かもしれないビルトインオブジェクトがあります –