web-dev-qa-db-ja.com

StructureMap例外コード:202 PluginFamilyに定義されたデフォルトのインスタンスはありません

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またはクラスファイルに他に何かを追加する必要がありますか?

前もって感謝します...

22
Peter

この問題は、ObjectFactory.InitializeObjectFactory.Configureに置き換え、プロジェクトにアセンブリを追加することで修正されました。

ObjectFactory.Configure(x =>
{
    x.Scan(scan =>
    {
        scan.LookForRegistries();
        scan.Assembly("MyAssembly");
        scan.Assembly("MyAssembly");
    });
});
22
Peter

同じエラーメッセージが表示されましたが、理由が異なりました。私は次のように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());
13
user456814

IConfiguration具象クラスのブートストラップはどこにありますか?

つまり:

x.For<IConfiguration>().Use<Configuration>();
6
RPM1984

もう1つ探すことは、注入する依存関係(クラス)がpublicであることを確認することです。クラスが内部の場合、この問題が発生する可能性があります。

3
chandler

同じエラーが発生しました。私の場合、実装名にタイプミスがあったため、インターフェースと実装名が一致しませんでした。

public class FooTypo : IFoo

私が持っているべきだった場所:

public class Foo : IFoo
3

私は、インターフェイスではなく別のクラスのコンストラクタで誤って具象型を参照したためです

たとえば、私が持っていたストラクチャーマップで

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) {...}
}

それはまた、私の例外がインターフェイスではなく具象型を参照したことを意味しましたが、最初はそれを逃しました

1
James Carter

NCrunchでVisual Studio 2015を使用していたときにも、この問題が発生しました。あなたがしなければならないのは、NCrunchの下の設定メニュー項目でオプションをtrueに切り替えるだけです。初期化を構成に切り替えると、うまくいきませんでした。

このオプションはビルド設定の下にあり、「参照されたアセンブリをワークスペースにコピーします」という名前です

0
Vishav Premlall

このエラーが発生したのは、クラスにpublicをマークするのを忘れたためです。とても簡単です。

0
ErikE