2

Я только начал работать с инъекцией зависимостей в первый раз, и я использую как Ninject 2.0 в качестве моего контейнера IoC на веб-сайте ASP.NET MVC 2, и я нахожу ошибку активации что я не уверен, как реагировать. Я уверен, что это просто так, надеюсь, кто-то может указать мне в правильном направлении, не задумываясь.ASP.NET MVC - ошибка активации Ninject 2.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 
        }; 
    } 
} 

Это довольно straightforward- Я пытаюсь загрузить некоторые данные из файла web.config и сохранить его в единственном объекте для использования через мои контроллеры , Вызов функции Bind работает точно так, как должен, и свойство Settings в моем провайдере корректно инициализируется коллекцией AppSettings в файле конфигурации. Тем не менее, когда приложение загружает первый раз:

 
Server Error in '/' Application. 
Error activating SByte* using implicit self-binding of SByte* 
No constructor was available to create an instance of the implementation type. 

Activation path: 
4) Injection of dependency SByte* into parameter value of constructor of type string 
3) Injection of dependency string into property WebsiteName of type WebsiteSettings 
2) Injection of dependency IWebsiteSettings into property WebsiteSettings of type HomeController 
1) Request for HomeController 

Suggestions: 
1) Ensure that the implementation type has a public constructor. 
2) If you have implemented the Singleton pattern, use a binding with InSingletonScope() instead. 

Интересно, если я обновить страницу, я не получаю исключение и вызов Kernel.Get() возвращает правильный объект.

Любой совет?

ответ

2

(мы говорили об этом на IRC, но я помещаю его здесь, в случае, если кто-то бежит в эту проблему, а также.)

WebsiteSettings имеет [Inject] атрибуты его свойств, так Ninject пытается решить привязка от System.String для ввода значения в свойства. Поскольку вы используете настраиваемый поставщик для активации экземпляров WebsiteSettings, вам не нужны атрибуты [Inject].

+0

какой irc канал? –

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.