StructureMapは初めてです。ダウンロードし、バージョン2.6.1.0を使用しています。以下のエラーが発生し続けます:
StructureMap例外コード:202 PluginFamily Company.ProjectCore.Core.IConfiguration、Company.ProjectCore、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = nullに対して定義されたデフォルトインスタンスはありません
私のGlobal.asax.csは次のようになります。
protected void Application_Start(object sender, EventArgs e)
{
var container = new Container(x =>
{
x.For<ICache>().Use<Cache>();
x.For<IEmailService>().Use<EmailService>();
x.For<IUserSession>().Use<UserSession>();
x.For<IRedirector>().Use<Redirector>();
x.For<INavigation>().Use<Navigation>();
});
container.AssertConfigurationIsValid();
}
デバッグするために、ObjectFactory.Initializeから「新しいコンテナ」に変更しました。 AssertConfigurationIsValid()メソッドをステップ実行すると、キャッシュは機能しますが、次の行のGetInstanceメソッドでEmailServiceが失敗します。
[Pluggable("Default")]
public class EmailService : IEmailService
private readonly IConfiguration _configuration;
public EmailService()
{
_configuration = ObjectFactory.GetInstance<IConfiguration>();
}
IEmailServiceを削除すると、同じ202エラーがIUserSessionでスローされます。
Application_Startまたはクラスファイルに他に何かを追加する必要がありますか?
前もって感謝します...
この問題は、ObjectFactory.Initialize
をObjectFactory.Configure
に置き換え、プロジェクトにアセンブリを追加することで修正されました。
ObjectFactory.Configure(x =>
{
x.Scan(scan =>
{
scan.LookForRegistries();
scan.Assembly("MyAssembly");
scan.Assembly("MyAssembly");
});
});
同じエラーメッセージが表示されましたが、理由が異なりました。私は次のように2つのコンストラクタを定義するクラスFooを持っていました:
public class Foo : IFoo
{
private Bar _bar;
public Foo()
{
_bar = new Bar();
}
public Foo(Bar bar)
{
_bar = bar;
}
}
そして私のStructureMap構成はそうでした:
For<IFoo>.Use<Foo>();
次のようなエラーメッセージが表示され続ける
202バーのデフォルトインスタンスが定義されていません
問題は、StructureMapが、パラメーターのないデフォルトコンストラクターを使用する代わりに、パラメーターを受け取るコンストラクターを使用してFooを構築しようとしたことでした。 StructureMapを使用してコードでデフォルトのコンストラクタを定義する方法 の答えを使用してそれを解決しました:
For<IFoo>.Use(() => new Foo());
IConfiguration具象クラスのブートストラップはどこにありますか?
つまり:
x.For<IConfiguration>().Use<Configuration>();
もう1つ探すことは、注入する依存関係(クラス)がpublicであることを確認することです。クラスが内部の場合、この問題が発生する可能性があります。
同じエラーが発生しました。私の場合、実装名にタイプミスがあったため、インターフェースと実装名が一致しませんでした。
public class FooTypo : IFoo
私が持っているべきだった場所:
public class Foo : IFoo
私は、インターフェイスではなく別のクラスのコンストラクタで誤って具象型を参照したためです
たとえば、私が持っていたストラクチャーマップで
x.For<IFoo>().Use<Foo>();
x.For<IBar>().Use<Bar>();
fooのコンストラクタはこのようになりました
public class Foo : IFoo {
public Foo(Bar bar) {...}
}
sMは単にBarのインスタンスを作成できなかったため、次のようになっているはずですが、それはIBarの作成方法を知っているだけです。
public class Foo : IFoo {
public Foo(IBar bar) {...}
}
それはまた、私の例外がインターフェイスではなく具象型を参照したことを意味しましたが、最初はそれを逃しました
NCrunchでVisual Studio 2015を使用していたときにも、この問題が発生しました。あなたがしなければならないのは、NCrunchの下の設定メニュー項目でオプションをtrueに切り替えるだけです。初期化を構成に切り替えると、うまくいきませんでした。
このオプションはビルド設定の下にあり、「参照されたアセンブリをワークスペースにコピーします」という名前です
このエラーが発生したのは、クラスにpublic
をマークするのを忘れたためです。とても簡単です。