質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

5950閲覧

参照されている側の別プロジェクトからGlobal.asax上のプロパティにアクセスしたい

dotnetuseryamag

総合スコア16

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2019/09/03 01:01

編集2019/09/04 01:45

前提・実現したいこと

.NET Framework 4.5.2、MVC5でWebサイトを構築中です。
View等を持つプロジェクトと共通処理やビジネスロジックを持つプロジェクトを分けたソリューション構成となっています。
このサイトを参考にGlobal.asax上にサイト共通のプロパティを持たせ、
そのプロパティを共通処理やビジネスロジックで参照しようとしています。

発生している問題・エラーメッセージ

Viewやcontoller側から共通処理やビジネスロジックを使用している為、
View等を持つプロジェクト(下図TestMVC)から共通処理等のプロジェクト(下図BusinessLogics)を参照する依存関係を持っています。
依存関係

この為、共通処理等のプロジェクト側からView等を持つプロジェクトへの参照設定が循環参照で行えず、
Global.asax上のプロパティ(下図Global.asax.vb内のTestVar)が共通処理等から見えない状態です。
参照しようとした場合のエラーとGlobal.asax内のプロパティ定義

このような構成のソリューションの場合、どのようにサイト共通のプロパティを持たせるべきでしょうか?

試したこと

Application変数の利用

System.Web.HttpContext.Current.Applicationを使用することで
サイト共通のプロパティは持てました。
しかし、こちらはデータ型の指定できず、
参照先を直接把握することもできませんでした。

VBNET

1'書き込む場合 2HttpContext.Current.Application.Lock() 3HttpContext.Current.Application("property_test") = "test" 4HttpContext.Current.Application.UnLock()
テスト用ソリューションの作成

簡単なソリューションを作成して確認しました。

新しいプロジェクトの作成で、ASP.NET Webアプリケーションを選択してTestMVCソリューションを作成
(手順再現の為、図ではWebApplication1)
新しいプロジェクト

MVCを選択
MVC

作成されたソリューションに、共通処理等を実装するBusinessLogicsプロジェクトを
クラスライブラリとして追加
プロジェクト追加

Controllers等から共通処理を使用する為、TestMVCにBusinessLogicsプロジェクトの参照を追加
参照設定

作成されたTestMVCプロジェクトのGlobal.asaxに
サイト共通のプロパティとしてTestVarを追加
共通プロパティ追加

BusinessLogicsプロジェクト側のクラスから、Global.asaxに追加したTestVarを参照したいが、
BusinessLogicsプロジェクトからTestMVCへの参照設定ができず、
参照することができない
共通処理プロジェクト側からの共通プロパティ参照

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/03 02:08

> 共通処理等のプロジェクト側からView等を持つプロジェクトへの参照設定が循環参照で行えず、 上記のところ、どういう形で循環参照になるのか状況が分からないです。Global.asax.cs の静的フィールドでなくHttpApplicationState なら可能というような記述がありますが、前者がダメで後者が可能という話も分からないです。 具体的な例を挙げてダメな理由を説明いただけませんか?
退会済みユーザー

退会済みユーザー

2019/09/03 02:32 編集

HttpApplicationState でも Global.asax.cs に記述する静的フィールドでも、(1) Web ファーム/ガーデンでは使えない、(2) ワーカープロセスのリサイクルで消えてしまう、(3) サーバーのメモリを圧迫するというデメリットがありますが、承知の上でしょうか? あとで、そういうことならやめると言われてもなんですので聞いてます。
dotnetuseryamag

2019/09/03 08:02

プロジェクトの関係について、質問に図を追加しました。 HttpContext.Current.Applicationであれば、依存関係に関わらず設定や参照が可能でしたが、ご指摘頂いている懸念点や、スレッドを跨いだ先ではNullに見えてしまう点等の問題を抱えています。
退会済みユーザー

退会済みユーザー

2019/09/03 10:09

> View等を持つプロジェクト(下図TestMVC)から共通処理等のプロジェクト(下図BusinessLogics)を参照する依存関係を持っています。 それは以下の記事にあるように "複数のプロジェクトを含むソリューションをビルドするとき、最初に特定のプロジェクトをビルドし、他のプロジェクトで使われるコードを生成することが必要な場合" ということですが、そういうことが必要なのでしょうか? 方法: プロジェクトの依存関係を作成および削除する https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-create-and-remove-project-dependencies?view=vs-2019
dotnetuseryamag

2019/09/03 11:50

プロジェクトのビルド順序は意識していなかったのですが、TestMVCのプロパティの参照にBuisinessLogicsを追加すると、TestMVCの依存関係のBuisinessLogicsに自動的にチェックが設定されました。チェックを外そうとすると「この依存関係は、プロジェクト システムによって追加されたため、削除することができません。」というメッセージが表示され、外せませんでした。
退会済みユーザー

退会済みユーザー

2019/09/03 13:09

検証用にゼロからごく簡単なソリューション/プロジェクトを作って試してみてはいかがですか? 今は何がどうなっているのか分かりません。
dotnetuseryamag

2019/09/04 01:49

検証用ソリューションの手順を 試したこと に追加しました。申し訳ありませんが、再現手順の為、図のソリューション名が説明分とは異なっています。
Zuishin

2019/09/04 01:52

Controller が View への参照を持つと、相互依存となり結合が強くなりすぎるので、分けた意味が無くなります。 このような場合は直接の参照を持たず、依存性注入やイベントで対応します。
退会済みユーザー

退会済みユーザー

2019/09/04 02:06 編集

何故循環参照になったのかやっとわかりました。理解が遅くてすみません。 まず最初にMVC プロジェクトからクラスライブラリプロジェクトへの参照設定を行って、その後クラスライブラリプロジェクトから MVC プロジェクトへの参照設定を行ったときに循環参照エラーが出たということですね。 クラスライブラリプロジェクトのコードから MVC プロジェクト内のクラスやフィールドを見えるようにするためだと思いますが、そもそもそういうことはできないはずです。 MVC プロジェクトからクラスライブラリプロジェクトのクラスを初期化して使っているのだと思いますが、であれば、その時にMVC プロジェクトで Global.asax の静的フィールドを取得してクラスライブラリプロジェクトに渡してやる他方法はなさそうです。
dotnetuseryamag

2019/09/04 11:53

Zuishin様 情報ありがとうございます。ご提案頂いた依存性の注入やイベントでの実装は私の勉強不足で今回のケースへの実装方法が思いつきませんでした。それぞれについて確認したいと思います。 SurferOnWww様 情報ありがとうございます。また、回答にて実装例も示して頂きまして、ありがとうございます。 回答の方法にてGlobal.asaxに編集していた内容を共通処理側でも見ることができました。 共通処理側から反映したい場合や、実行中に書き換えられた場合の反映等もありそうでしたので、 その際は共通プロパティをClassにして、参照を渡したいと思います。 大変助かりました。後ほどベストアンサーを設定します。ありがとうございました。
guest

回答1

0

ベストアンサー

何故循環参照になったのかやっとわかりました。理解が遅くてすみません。

まず最初にMVC プロジェクトからクラスライブラリプロジェクトへの参照設定を行って、その後クラスライブラリプロジェクトから MVC プロジェクトへの参照設定を行ったときに循環参照エラーが出たということですね。

クラスライブラリプロジェクトのコードから MVC プロジェクト内のクラスやフィールドを見えるようにするためだと思いますが、そもそもそういうことはできないはずです。

MVC プロジェクトからクラスライブラリプロジェクトのクラスを初期化して使っているのだと思いますが、であれば、その時にMVC プロジェクトで Global.asax の静的フィールドを取得してクラスライブラリプロジェクトに渡してやる他方法はなさそうです。

具体的には以下のような感じです。これでは質問者さんの望むことはできませんか?

Global.asax.cs

イメージ説明

クラスライブラリ

イメージ説明

Controller / Action Method

イメージ説明

質問に対するコメントに書いたことですが、HttpApplicationState でも Global.asax.cs に記述する静的フィールドでも、(1) Web ファーム/ガーデンでは使えない、(2) ワーカープロセスのリサイクルで消えてしまう、(3) サーバーのメモリを圧迫するというデメリットがあります。それを考えると、個人的にはあまり利用度は高くなさそうだと思っています。

投稿2019/09/04 02:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dotnetuseryamag

2019/09/04 11:59 編集

回答ありがとうございました。 また、デメリットについても十分検討の上、使用したいと思います。 今回は小さな変数が少しで、ワーカープロセスも一つのみ、 リサイクルタイミングも計画しての停止という要件ででしたので、実装を進めたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問