Простые веб-формы инжектора

#c# #asp.net #.net #code-behind #simple-injector

#c# #asp.net #.net #кодирование #простой инжектор

Вопрос:

Итак, у меня есть слой пользовательского интерфейса и слой BLL.

 namespace BLL 
{
   public class User : IUser
   {
        public void DoSomething(){}
   }
   public interface IUser
   {
        void DoSomething();
   }
   public static class TypeRegistry
   {
        public static void RegisterTypes(Container container)
        {
            container.Register<IUser, User>(Lifestyle.Singleton);
        }
    }
}

namespace UI
{
     public partial class Login : System.Web.UI.Page
     {
          private IUser user;
     }
}
 

Я не могу понять, как заставить пользователя не быть нулевым. Я попытался создать конструктор, но это вызвало ошибку

     public Login(IUser user){ this.user = user;}
 

Ошибка компиляции: Login не содержит конструктор, который принимает 0 аргументов

Комментарии:

1. Вы настроили ASP.NET использовать ваш фреймворк внедрения зависимостей? И правильно ли вы настроили платформу DI для обработки зависимостей для ASP.NET ?

2. Я добавил пакет simple injector, если вы это имеете в виду. Но я знаю, что простой инжектор вводит объект в конструктор, но в пользовательском интерфейсе у вас нет конструктора

3. Вам необходимо инициализировать user поле в событии страницы. Взгляните на жизненный цикл страницы и определите, какое событие подходит (вероятно Page_Init , или Page_Load ) для вашего варианта использования.

Ответ №1:

Эта ссылка помогла мне получить ответ:

https://simpleinjector.readthedocs.org/en/latest/wpfintegration.html

Похоже на ссылку @Steven

https://simpleinjector.readthedocs.org/en/latest/windowsformsintegration.html

Ответ №2:

Если вы выполнили всю регистрацию надлежащим образом, как показано в руководстве по интеграции веб-форм документации, то я думаю, что проблема связана с тем, что вы установили уровень доступности IUser на своей странице private .

Так private IUser user; и должно стать public IUser user; . Поскольку веб-формы требуют, чтобы вы выполняли внедрение свойств поверх внедрения конструктора, пользователь свойства должен быть общедоступным для внедрения.