サービスファブリックでは7つのサービスが実行されています。コードは非常に一般的なので、汎用のOwinCommunicationsListenerクラスを作成することにしました。一般的なOwinCommunicationsListenerを使用してステートレスサービスに依存性注入を追加する方法
私はサービスファブリック用のテンプレートは、静的クラスとして(パイプラインを構成します)起動クラスを設定し、私はDIを行う必要がある場合は、ステートレスなサービスクラスがアクション
internal sealed class WebService : StatelessService
{
public WebService(StatelessServiceContext context)
: base(context)
{ }
/// <summary>
/// Optional override to create listeners (like tcp, http) for this service instance.
/// </summary>
/// <returns>The collection of listeners.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext => new OwinCommunicationListener(Startup.ConfigureApp, serviceContext, ServiceEventSource.Current, "ServiceEndpoint"))
};
}
}
としてそれを渡すことに気づきましたこれらのオブジェクトをスタートアップクラスに渡す必要があります。テンプレートから、私が見ることができる唯一の方法は、これらのオブジェクトをOwinCommunicationsListenerに設定するか、OwinCommunicationsListenerにパラメータを渡すことです。どちらかがOwinCommunicationsListenerがあまり一般的でないことを意味します。
WordCountの例で気付いたのは、通常の起動クラスを使って、OwinCommunicationsListenterに参照を渡したことです。このようにして、ServiceClassはDIとOwinCommunicationsListenerで使用できるいくつかのオブジェクトをStartupに渡すことができます。
public class WordCountWebService : StatelessService
{
public WordCountWebService(StatelessServiceContext context)
: base(context)
{
}
/// <summary>
/// Creates a listener for Web API with websockets.
/// </summary>
/// <returns>The OWIN communication listener.</returns>
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener(initParams => new OwinCommunicationListener("wordcount", new Startup(MyDIObject), initParams))
};
}
}
私はいくつかのサービスが共有する一般的なヘルパーとして脳とOwinCommunicationsListenerクラスとしてステートレスサービスクラスを考えるならば、私がWORDCOUNT例と同じルートを行くと、非静的起動を持つべきであると思われますクラス。このアプローチには欠点がありますか?私は、マイクロサービスのアイデアが私たちに多くのものを持ち、このような一般的な足場がメンテナンスと信頼性を向上させることができるというとき、テンプレートがそのアプローチを使用しない理由を疑問に思っていました。
ワードカウントの保証をありがとう。私のアプリケーションでは、CommunicationsListener、HttpClient&factory、例外ハンドラはすべて抽象化されており、現在10のサービスすべてがそれらを共通として使用しています。 私は非SFラッパーにコアを使用していますが、SFのコアテンプレートは「プレビュー」とマークされています。 :-)サービスは認証、データのセキュリティなどを扱いますので、私は "勇敢"になる必要があります! 私は最終的なコアへの移行を簡単にする(ロギングやコンフィギュレーションのように)が、まだDIをまねしていないようなコアのようなパターンを作りました。 – MarkD
十分に公正です。 "プレビュー"タグを詳しく説明すると、これは主に1.0 RC2リリースのWebホスト(WebListener)を指しているので、プレビュータグはすぐに消えてしまいます。それ以外の場合、ASP.NET Coreは公式にリリースされ、バージョン1.0でサポートされます。 –