ASP.NET Coreの準備:クロスプラットフォームモジュラーフレームワークの作成

ASP.NET Coreのコラムは、ウクライナのUbranians会社の責任者であるDmitry Sikorsky( DmitrySikorsky )からの別の出版物で続けています。 今回は、Dmitryが、ASP.NET Coreに基づいたモジュール式のクロスプラットフォームフレームワークを開発した経験について語っています。 このコラムの以前の記事は、 #aspnetcolumn -Vladimir Yunevでいつでも読むことができます。
私のタスクの詳細のため、最近、ASP.NET Core(およびその前-以前のバージョンのASP.NET)上のWebアプリケーションのモジュール式で拡張可能なアーキテクチャについて多くのことを考えなければなりません。 その結果、ExtCoreが登場しました。これは、Webアプリケーションを文字通りシンプルなNuGetパッケージでモジュール化された拡張可能なものに変えることができる、小さなオープンソースのクロスプラットフォームフレームワークです。









主な機能



ExtCoreは、依存関係に明示的なリンクがあるプロジェクト(ソースコードまたはNuGetパッケージの形式)と、特定のフォルダーにあるプロジェクトの両方で定義されたタイプ(およびビューと静的コンテンツ)を検出して使用できますコンパイル済みDLLアセンブリとして。



便宜上、オプションで、これらのプロジェクトを条件付きで拡張機能に結合できます(つまり、各拡張機能は1つまたは複数のプロジェクトで構成できます)。 また、各拡張機能は(プロジェクトの1つに)IExtensionインターフェイスを実装するクラスを持つことができ、ExtCoreは、このインターフェイスを実装するすべてのクラスのインスタンスのアクセス可能なセットをいつでも取得できるようにします。 これらのクラスを使用して、拡張機能を記述するメタデータ、拡張機能の初期化(ルートの登録など)などを提供できます。



フレームワーク自体にはデータの操作に関連する機能は含まれていませんが、これに必要なすべての機能(すべての拡張機能の単一のストレージコンテキストを含む)は、ExtCore.Data拡張機能で実装されています。



aspnetcolumngithub アドバイス! 自分で試すか、GitHub https://github.com/ExtCore/ExtCore-Sampleからソースコードをダウンロードして試してください


仕組み



アプリケーションが起動すると、ExtCoreはすべてのアセンブリ(明示的なリンクがあるアセンブリ、および明示的なリンクはないが特定のフォルダにあるアセンブリ)を検出します。 ExtCore.Infrastructureへのリンクを含むアセンブリのみが選択され、ロードされます。



さらに、選択基準を満たすすべての検出されたアセンブリはExtensionManagerコンテナクラスに配置され、どこからでも(つまり、メインアプリケーションプロジェクトと他のプロジェクトの両方から)いつでも取得できます。 これらのアセンブリは、コントローラーの検索のソースとして「登録」されます(明示的に参照されるアセンブリのすべてのコントローラーはASP.NETによって自動的に検出されますが、その他は追加で「手動で」報告する必要があります)、ビュー(およびリソースの形式で、以前コンパイル済み)および静的コンテンツ。



その後、このインターフェイスの利用可能な実装のインスタンス間で、多くのIExtensionメソッドが実行されます。 したがって、拡張機能は、ConfigureServices、Configureなどのメソッドの実行中にコードを実行する機会を得ます。



推奨される拡張構造



理解を簡素化し、統一性を維持するには、独自の拡張機能を開発するときに次の構造に従うことが便利です(Xは拡張機能の名前です)。





YourApplication。 X



主な拡張プロジェクト。 IExtensionインターフェイスを実装するクラスと、他のプロジェクトで使用される一般的なクラスが含まれています。 拡張機能にさまざまな領域(フロントエンドやバックエンドなど)が含まれていない場合、ユーザーインターフェイスに関連するもの(コントローラー、ビューモデル、ビューなど)もこのプロジェクトに配置できます。



YourApplication.X.Frontendおよび YourApplication.X.Backend



プロジェクトは、例のためだけに名前が付けられています。 この方法でユーザーインターフェイスのさまざまな部分を分離すると便利なようです(特にチームで作業する場合)。 また、Webアプリケーションが多数の拡張機能で構成されている場合、フロントエンドとバックエンドの共通要素をベースプロジェクトに転送し、他のすべての要素でそれらを参照できます。 したがって、たとえば、すべての拡張機能は、特定のDLLファイルをコピーすることで簡単に置き換えることができる、統一された外観または基本的なコントロールのセットを持つことができます。



ExtCoreは、ビューを操作するための2つのオプション(同時に)をサポートしています:リソースビューとプリコンパイル済みビュー。 つまり、2番目のオプションを使用することをお勧めします。 ExtCoreで使用されるビューの操作方法については、記事ASP.NET Coreの準備で詳細を読むことができます:ビューを操作するための非標準的なアプローチについて話しましょう。



静的コンテンツの操作も簡単です。 記事ASP.NET Coreの準備:静的コンテンツをリソースとして提示する方法では、ExtCoreで使用される方法について詳しく説明しています。 記事を要約すると、必要な静的コンテンツはリソースとしてアセンブリに配置され、これらのアセンブリはファイルプロバイダーとして「登録」されます。これにより、通常の物理ファイル(HTTP経由の直接アクセスを含む)



興味深いことに、アプリケーション全体がビューと静的コンテンツの両方のスコープです。 つまり、一部の拡張機能は他の拡張機能のコンテンツを使用でき、その逆も可能です。 さらに、拡張機能は、メインWebアプリケーションのビューと静的コンテンツを使用できます。 したがって、たとえば、拡張プロジェクトでロジックを記述することができますが、ユーザーがメインアプリケーションですべてがどのように見えるかを決定することができます。



YourApplication。 X. データ*



データの操作を説明するプロジェクト。 詳細については、以下をご覧ください。



データを操作する



ExtCoreには、オプションのExtCore.Data拡張機能が追加されており、データの操作に必要なすべての基本機能が実装されています。 拡張の中心的な要素は、IStorageインターフェイス(作業単位)です。 このインターフェイスでは、GetRepositoryとSaveの2つのメソッドのみを説明しています。 GetRepositoryの実装は、要求されたインターフェイス(およびIRepository)を実装するリポジトリの利用可能なインスタンスを検出して返し、すべてのリポジトリが単一のストレージコンテキスト(IStorageContextインターフェイス)を持つようにします。



さまざまな拡張機能からのエンティティタイプの何らかの種類の登録が必要な場合(たとえば、EntityFrameworkの場合)、これはExtCore.Data.EntityFramework.SqliteおよびExtCore.Dataで使用されるIModelRegistrarインターフェイスのようなものを使用して簡単に実現できます。 .EntityFramework.SqlServer。 テストプロジェクト(記事の最後にあるリンク)は、このアプローチを示しています。



拡張構造は次のとおりです。





ExtCore.Data



プロジェクトには、IExtensionインターフェイスを実装するクラスが含まれています。 このクラスは、アプリケーションの起動時に、使用可能なIStorageインターフェイスの実装を検出するコードを実行し(以下を参照)、ASP.NET Core DIビルトインに登録し、必要に応じてコントローラーがインスタンスを取得できるようにします。 依存関係のリンクを変更するか、DLLファイルをコピーするだけで、サポートされているストレージのタイプを変更できます。



ExtCore。 データ モデル 抽象化



このプロジェクトでは、すべての拡張機能のすべてのエンティティが実装する必要があるIEntityインターフェイスについて説明します。



ExtCore。 データ 抽象化



このプロジェクトでは、上記で説明したIStorageContext、IStorage、IRepositoryの主要なインターフェイスについて説明します。 私自身の拡張では、YourApplication.X.Data.Abstractionsのような名前のリポジトリインターフェイスをプロジェクトに配置し、特定のリポジトリの実装に縛られることなくそれらを操作できるようにしました。



ExtCore。 データ EntityFramework。 Sqliteおよび ExtCore。 データ EntityFramework。 SqlServer



プロジェクトには、特定のリポジトリ(この場合はSqliteとSqlServer)のExtCore.Data.Abstractionsからのインターフェイスを実装するクラスが含まれています。



結論



現時点では、これは単なるアルファ版です。 プロジェクトの開発には多くの計画があります(いつでも拡張機能を接続および切断し、一般的な最適化を行います。ExtensionManagerクラスに取り組み、IExtensionだけでなく、特定のインターフェイスの利用可能な実装を取得する便利な機能を追加します)。 このフレームワークをプロジェクト(CMS)で使用します。 私が判断できる限り-それは便利かつ柔軟に判明しました。 コメントと批判を聞いてうれしいです。 ありがとうございます!



ソースへのリンクは次のとおりです: https : //github.com/ExtCore/ExtCore



そして、完成したテストプロジェクトへのリンクは次のとおりです: https : //github.com/ExtCore/ExtCore-Sample



著者向け



ご友人、ご自身の資料でコラムをサポートすることに興味がある場合は、すべての詳細を議論するためにvyunev@microsoft.comまでご連絡ください。 ASP.NETおよびその他のトピックについて興味深い話ができる著者を探しています。



著者について



シコルスキー・ドミトリー・アレクサンドロヴィチ

Ubrainians Company( http://ubrainians.com/

オーナー、マネージャー

ドミトリーシコルスキー



発表! DevCon 2016でのディープインテンス



画像



ASP.NET Coreの詳細な集中コースを[DevCon 2016カンファレンス](https://events.techdays.ru/DevCon/2016/registration)で発表できることを嬉しく思います。 このコースは会議の2日目に行われ、6時間以内に会議の1日がかかります。



オープンプラットフォームASP.NET 5での最新のWebアプリケーションの開発

この取り組みの一環として、参加者は最新のASP.NET 5でWebアプリケーションを開発することに専念するエキサイティングで冒険的な旅に参加します。ゼロからクラウドに展開される本格的なアプリケーションに至るまで行きます。 また、参加者は、ASP.NETの内部構造の調査を停止し、Entity Framework 7を使用してリレーショナルデータベースとNoSQLデータベースを操作し、MVCフレームワークでアプリケーションを開発し、モデル、ビュー、ビジネスロジックを構築し、REST APIを作成し、継続的な開発プロセスを整理することができますGitとVisual Studio Onlineでテストし、AzureコンテナーとDockerコンテナーでデプロイします。 旅の終わりに、すべての参加者は開始に合格し、ASP.NETの名誉ある騎士になります。



DevCon 2016カンファレンスへの登録はすでに開始されています! こちらから登録してください



All Articles