2017-07-20 10 views
6

現時点では、私は仕事場で多くの小さなAPIを構築しています。これらのプロジェクトの多くは、基本的なコントローラロジックを共有しています。それらをナゲットパッケージに追加し、起動時にそれらを使用する方法はありますか?例えば、
など。 Mvcを追加するのと同じように:デフォルトのMVCコントローラを共有

IApplicationBuilder app;  
....  

app.UseMvc; 
app.UseBasicApiVersionController(); 

私たちはすべてのマイクロサービスでバージョンエンドポイントを持っています。
例:
http://url/version
戻っ{ "バージョン": "1.0.0"}
私はnugetパッケージにこれを作るだろうか?
すべての開発者は、このエンドポイントをマイクロサービスに追加するために1行のコードを追加するだけで済みます。私たちはdotnetコアを使用しています。
がnugetパッケージを作成するのに役立ちません。それは自己:)

開始するための私の推測では、これに似たものである:

public static IApplicationBuilder UseBasicApiVersionController(this IApplicationBuilder app) 
    { 
     if (app == null) 
     throw new ArgumentNullException("app"); 

     ..... // What should I do? 

     return app; 
    } 

*編集:
あなたはパッケージをnugetするようにコントローラを追加する場合プロジェクトが自動的に検出されます。しかし、それは私が望む機能ではありません。
私はそのコントローラを必要とする10のサービスを持っているかもしれません。一方のサービスだけを持っている間に、もう一方のバージョンコントロールロジックが必要です。例えば。顧客が直面しているアプリケーションには、「/バージョン」エンドポイントはありません。
そのため、起動時にapp.UseBasicApiVersionController()を使用する必要があります。

+1

代替アプローチとして、既定のコントローラーで既定のプロジェクトテンプレートを作成する方法について説明します。または単にプロジェクト。レポを複製するだけで、必要なものすべてから始めることができます。そのプロジェクトをフォーク/ブランチアウトして、さまざまな種類のマイクロサービスのさまざまな出発点を作成することもできます。 – Marco

+0

@マルコ>それについて考えていた。しかし、将来、バージョンエンドポイントの仕組みのロジックを変更すれば、すべてのプロジェクトに入り、修正する必要があります。 例今はバージョン番号が必要です。 しかし、後でラベル:Aplha/beta/releaseが必要な場合があります。 すべてのレガシープロジェクトを開き、既定のコントローラの新しいロジックを追加するのではなく、更新するだけで、ナゲットパッケージがあればいいでしょう。 – Kiksen

+0

依存関係注入を使用することもできます。有効なクライアントURLを構築するために必要なすべての動的データを受け入れるいくつかの種類のURLフォーマッタクラスを提供できます。 – Silvermind

答えて

0

バージョンだけの場合は、共有拡張またはバージョンを返すミドルウェアを追加できます。

public class VersionMiddleware: OwinMiddleware 
{ 
    private static readonly PathString Path = new PathString("/version"); 
    private OwinMiddleware Next; 

    public VersionMiddleware(OwinMiddleware next) : base(next) 
    { 
     Next = next; 
    } 

    public async override Task Invoke(IOwinContext context) 
    { 

     if (!context.Request.Path.Equals(Path)) 
     { 
      await Next.Invoke(context); 
      return; 
     } 

     var version = Assembly.[HowToGetYourVersionAsAnObject] 

     context.Response.StatusCode = (int)HttpStatusCode.OK; 
     context.Response.ContentType = "application/json"; 
     context.Response.Write(JsonConvert.SerializeObject(responseData)); 
    } 
} 
+0

アイデアはダイナミックでなければならず、単なるバージョン以外のものにも使われなければならないということです。 コメントのようにコメントします。 私は将来、Version + Labelを返すことにします。または、剃刀全体のビュー。 – Kiksen

+0

カミソリビューを返すことは別の機能かもしれません。他はミドルウェアコンポーネントの数に過ぎません。 – mhermann

+0

しかし、あなたは正しいです。それはコントローラほど多用途ではありません。問題は、それが将来の潜在的な必要条件の要件か設計かどうかである。 – mhermann

関連する問題