2016-04-28 11 views
1

背景:Asp.Netコアのウェブサイトは、ウェブサイトの様々な部分に必要なサービスを中継する依存性注入を使用しては、動的依存性注入のサービスに更新

私は私のスタートアップにConfigureServices方法でIServiceCollectionに追加されているサービスを持っています

//Settings 
services.AddSingleton<ISettingsService, SettingsService>(); 
services.AddSingleton<ISettingsIO, SettingsIO>(); 
services.AddSingleton<ISettings>(f => 
{ 
    return f.GetService<ISettingsService>().GetSettings(); 
}); 

これは素晴らしい作品と私​​は例にアクセスする必要があるすべてのページ/コントローラは問題なく行うことができます:次のようにシングルトンとしてクラス。

しかし、GetSettings()メソッドで取得されているデータを変更する機能が追加されました。これは、をServiceCollectionに追加されたサービスに更新する必要があることを意味します。

これを行うにはどうすればいいですか?サービスをシングルトンからトランジェントに変更することなくを使用しないでください。

ありがとうございました!

+0

を'GetSettings'はどのように実装されていますか? –

+1

'ISettingsService'がallreadyなので、' ISetting'もなぜシングルトンであるのか分かりません。なぜそれを一時的なものかスコープ的なものとして使用し、シングルトンの人が 'SettingsService'を解決させるのはなぜですか? –

+0

@YacoubMassad - GetSiteSettingsは、クエリからデータベースに作成するISiteSettingsオブジェクトを返します。 – khrave

答えて

1

私がコメントで言ったように、これはあまりきれいではありません。よりよい解決策には、あなたのシステムに関するより多くの情報が必要だと私は思っています。

変更可能な設定のラッパークラスを作成します。

public class MyMutableSettings : ISettings 
{ 
    public ISettings Settings {get;set;} 

    //Implement the ISettings interface by delegating to Settings, e.g.: 
    public int GetNumberOfCats() 
    { 
     return Settings.GetNumberOfCats(); 
    } 
} 

そして、あなたはこのようにそれを使用することができます:あなたが設定を変更したい場合、その後

MyMutableSettings mySettings = new MyMutableSettings(); 

services.AddSingleton<ISettings>(f => 
{ 
    mySettings.Settings = f.GetService<ISettingsService>().GetSettings(); 

    return mySettings; 
}); 

mySettings.Settings = GetMyNewSettings();