2017-01-11 11 views
1

をウェブホストによって使用されるservicecollectionでサービスを交換するので、私はそうのような実行時にstartup.csにサービスコレクションに追加されたクラスのインスタンスを持っている:[OK]を.NETコアに

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddSingleton<WidgetProvider, BlueWidgetProvider>(); 
    } 

しかし、実行している間、私がしたいですBlueWidgetProviderRedWidgetProviderに置き換えることができるアプリケーションです。これをどうやってやりますか? IServicesCollectionRemoveメソッドを使用できますが、これをアプリケーションにどのように公開するのですか?以下のようにWidgetProviderが追加されたIServiceProviderが公開されていますが、根底にあるサービスコレクションへのアクセス方法はわかりません。

は、サービスを構成するときにスタートアップが異なるウィジェットプロバイダを使用するように指示するいくつかの設定変更を行います:私のために働いて

public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

     Current.Services = host.Services; //Here 

     host.Run(Current.AppCancellationSource.Token); 
    } 
+0

アプリケーションにはどのWidgetProviderが必要ですか? – Ahmar

+0

アプリケーション全体を再起動することなく、ユーザーがWidgetProviderを変更できるようにするのは、単純にユーザー入力です。 –

答えて

1

まあひとつの方法は、host.Run方法をキャンセルして、再帰的に、このように再びMainを呼び出すことです

public void Restart() 
{ 
    Current.AppCancellationSource.Cancel(); 
} 
host.Run方法をキャンセルする
public void UseRedWidgetProvider() { 
    database.UseRedWidgetProvider(); 
    Restart(); 
} 

方法の

静的クラスはキャンセルトークンを含むように:キャンセルトークンが呼び出された後

public static class Current 
{ 
    public static CancellationTokenSource AppCancellationSource = new CancellationTokenSource(); 
} 

再帰的Mainを開始します。

public static void Main(string[] args) 
{ 
    var host = new WebHostBuilder() 
     .UseKestrel() 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .Build(); 

    CoreCurrent.Protector = ActivatorUtilities.CreateInstance<DataProtect>(host.Services); 

    Current.Services = host.Services; 

    Current.SetDbConfigurationState(); 

    host.Run(Current.AppCancellationSource.Token); 

    //reset token and call main again 
    host.Dispose(); 
    Current.AppCancellationSource = new System.Threading.CancellationTokenSource(); 
    Main(args); 
} 

これは私のために[OK]を働いているように見えます。取り消しトークンを呼び出すと、アプリはかなり早く再開し、新しいウィジェットプロバイダが使用されているように見えます。これが良い習慣であるかどうか、または混乱している可能性のあるコンポーネントがあるかどうかは完全にはわかりません。

関連する問題