2

初めて依存性注入を使い始めたばかりで、ASP.NET MVC 2WebサイトのIoCコンテナーとしてNinject2.0として使用していますが、対応方法がわからないアクティベーションエラーが発生しています。簡単だと思いますので、あまり考えずに誰かが私を正しい方向に向けてくれることを願っています。

クラスBaseControllerに、IWebsiteSettingsを受け取り、[Inject]属性でフラグが付けられたプロパティがあります。StandardKernelで、次のコードを使用してモジュールをロードします。

public class WebModule : Module
{
    public override void Load()
    {

        Bind<IWebsiteSettings>()
            .ToProvider(new WebsiteSettingsProvider(WebConfigurationManager.AppSettings))
            .InSingletonScope();

    }
}

public class WebsiteSettingsProvider : Provider<WebsiteSettings>
{
    private const string WebsiteNameKey = "Website.Name";
    private const string ContactFormEmailSubjectKey = "ContactForm.EmailSubject";
    private const string ProductImageDirectoryKey = "Products.ImageDirectory";
    private const string UploadTempDirectoryKey = "Uploads.TempDirectory";

    protected NameValueCollection Settings { get; set; }

    public WebsiteSettingsProvider(NameValueCollection settings)
    {
        Settings = settings;
    }

    protected override WebsiteSettings CreateInstance(IContext context)
    {
        return new WebsiteSettings
                   {
                       WebsiteName = Settings[WebsiteNameKey] ?? string.Empty,
                       ContactFormEmailSubject = Settings[ContactFormEmailSubjectKey] ?? string.Empty,
                       ProductImageDirectory = Settings[ProductImageDirectoryKey] ?? string.Empty,
                       UploadsTemporaryDirectory = Settings[UploadTempDirectoryKey] ?? string.Empty
                   };
    }
}

これはかなり簡単です。web.configファイルからいくつかのデータをロードし、コントローラー全体で使用できるようにシングルトンオブジェクトに保存しようとしています。Bindの呼び出しは正常に機能しているようで、プロバイダーのSettingsプロパティは、構成ファイルのAppSettingsコレクションで正しく初期化されています。それでも、アプリケーションが最初にロードされるとき:

'/'アプリケーションのサーバーエラー。
SByte*の暗黙的なセルフバインディングを使用したSByte*のアクティブ化中にエラーが発生しました
実装タイプのインスタンスを作成するために使用できるコンストラクターはありませんでした。

アクティベーションパス:
 4)型stringのコンストラクターのパラメーター値への依存性SByte*の注入
 3)タイプWebsiteSettingsのプロパティWebsiteNameへの依存性文字列の挿入
 2)HomeControllerタイプのプロパティWebsiteSettingsへの依存性IWebsiteSettingsの注入
 1)HomeControllerのリクエスト

提案:
 1)実装タイプにパブリックコンストラクターがあることを確認します。
 2)シングルトンパターンを実装している場合は、代わりにInSingletonScope()を使用したバインディングを使用してください。

興味深いことに、ページを更新しても例外は発生せず、Kernel.Get()を呼び出すと正しいオブジェクトが返されます。

何かアドバイス?

4

2 に答える 2

2

(これについてはIRCで話しましたが、他の誰かがこの問題に遭遇した場合に備えて、ここに置いておきます。)

WebsiteSettingsプロパティに[Inject]属性があるため、Ninjectは、からのバインディングを解決System.Stringして、プロパティに値を注入しようとしています。カスタムプロバイダーを使用してインスタンスをアクティブ化するため、そのプロパティに属性WebsiteSettingsは必要ありません。[Inject]

于 2009-08-26T22:05:50.397 に答える
0

問題のあるコードは、実際には私がこれを行っていたWebsiteSettingsクラスにありました。

public class WebsiteSettings : IWebsiteSettings
{
    [Ninject.Inject]
    public string WebsiteName
    {
        get; set;
    }

    [Ninject.Inject]
    public string UploadsTemporaryDirectory
    {
        get; set;
    }

    [Ninject.Inject]
    public string ContactFormEmailSubject
    {
        get; set;
    }

    [Ninject.Inject]
    public string ProductImageDirectory
    {
        get; set;
    }
}

プロパティにInject属性を配置することで、Ninjectにバインドしたことのない値を割り当てようとしました。タイプをロードするためにプロバイダーを使用しているので、Inject属性を含める必要はありません。

于 2009-08-26T22:06:13.937 に答える