2

2 つのプロジェクトがあります。1 つは MVC サイトで、もう 1 つはクラス ライブラリです。MVC サイトはクラス ライブラリを参照します。

IWindsorInstallerMVC サイトとクラス ライブラリに を実装しています。MVC サイトには、クラス ライブラリで定義されたクラスを直接参照するコードはありません。それらはすべて、別の場所で定義されたインターフェイスの実装です。

MVCサイトでは、アプリ起動でいつも通りやってます

var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());

これは、クラス ライブラリのインストーラーを呼び出しません。ただし、これを行うと

container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>());

インストーラーが 2 回呼び出されます。InThisApplicationキャッスルがピックアップするには、他のアセンブリへの実際のコード内参照が必要なようです。これを行うだけでこれを修正できます:

container.Install(FromAssembly.This());
container.Install(FromAssembly.Containing<ClassFromTheClassLibrary>());

しかし、他のアセンブリを直接参照する必要がないことを望んでいました。

更新名前空間は次のとおりです。

  • MVC アプリは MyApp.OnlineProducts.Service です
  • クラス ライブラリは MyApp.Individuals.Service です
4

4 に答える 4

2

必要な命名規則に従ってアセンブリに名前を付ける場合、これは機能するはずです。メイン アプリケーション アセンブリ名が MyApp.exe の場合、MyApp.*.dll などの他のクラス ライブラリに名前を付ける必要があります (例: FirstClassLibrary.Whatever.dll および MyApp.SecondClassLibrary.dll)。Windsor は、命名を順守するすべての関連ライブラリを取得します。大会。この動作について説明している Windsor ドキュメントのこのページを参照してください。

于 2012-10-02T00:38:31.760 に答える
2

FromAssembly.InThisApplication() は、呼び出し元のアセンブリをプレフィックスとして使用してアセンブリに一致します。MyApp.dll からの呼び出しは、MyApp.Core.dll と MyApp.Stuff.dll に一致します。

では、クラス ライブラリの名前を変更することはオプションでしょうか?

それ以外の場合は、FromAssembly.InDirectory(new AssemblyFilter("c:\dir","*.dll"))
を使用して「コンポーネント アセンブリ」を見つけます。

== 更新 == 私のコメントは誤解を招くものです。

FromAssembly.InThisApplication() は、呼び出し元のアセンブリから参照されているアセンブリのみをウォークします。

于 2012-10-02T00:42:30.137 に答える
0

ここの他の回答に従って、Webアプリ/ wcfサービスを構築するときは、クラスが呼び出していることを確認してください

var container = new Castle.Windsor.WindsorContainer();
container.Install(FromAssembly.InThisApplication());

App_Code フォルダーには存在しません。ウィンザー ブートストラップ プロセスはメソッドが App_Code のどこかにあることに依存しているため、これは間違いやすいですAppInitialize()が、実際のブートストラップ コードを App_Code フォルダーに置くと、別の App_Code アセンブリに存在し、ここで説明したアセンブリ プレフィックスの変換が壊れます。

于 2015-06-26T09:18:02.760 に答える