2015-11-30 1 views
3

Я использовал autofac, mvc 4.0. Я зарегистрировал интерфейсы и модули в Application_Start моего приложения mvc 4.0. Я также использовал свойство автоматического проводные напримерРешить услугу Использование DI в Startup.cs

protected void Application_Start() 
     { 
//Other codes... 
builder.RegisterType<Service>() 
       .As<IService>() 
       .InstancePerLifetimeScope() 
       .PropertiesAutowired()); 
     builder.RegisterControllers(typeof (MvcApplication).Assembly) 
        .PropertiesAutowired(); 
... 
} 

Однако Зависимости не разрешено в классе запуска, а объект всегда нуль.

public class Startup 
    { 
    public IService MyService { get; set; } 
     public void Configuration(IAppBuilder app) 
     { 
      MyService.SomeMetod(3, ""); 
     } 
    } 

В коде выше я ожидал MyService быть объектом, но его не так это всегда пустой, я делаю что-то не так, пожалуйста, помогите.

Обратите внимание: di работает в контроллерах, он не работает только в классе запуска!

+0

Для того, чтобы вашей зависимости, который будет введен в ваш класс 'Startup', класс, создавший экземпляр вызывающего класса, должен был быть создан вашим контейнером DI. Если это не так, это не сработает :) – Luke

+1

Возможный дубликат [Autofac Ввод данных в класс запуска OWIN] (http://stackoverflow.com/questions/33654149/autofac-injection-of-data-into- owin-startup-class) – Martin

ответ

2

Я ожидал AutoFac разрешить зависимость автоматически, как это происходит в классах контроллеров, она была решена с помощью ручного разрешения следующим образом:

var myService = (IService)DependencyResolver.Current.GetService(typeof(IService)); 
+0

Если вы позвоните в .GetService, или что-то подобное на вашем коде, это обычно знак, что вы «делаете это неправильно». Вы привязываете свой класс Startup к коду зависимостей, который должен держаться подальше от вашего «стандартного кода». Лучшим решением является регистрация класса Startup для инъекций зависимостей по моему ответу ниже. ИМО. –

-2

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

Возможно, у вас есть другой код Autofac в вашем приложении или нет?

Поскольку Autofac необходимо настроить компонент класса запуска. Что-то вдоль этих линий:

builder.RegisterType<Startup>() 
      .As<Startup>() 
      .InstancePerDependency() 
      .PropertiesAutowired()); 

ли вам нужен экземпляр каждой зависимости, один экземпляр или другой зависит от реализации.

И: как вы строите экземпляр запуска? Это компонент, созданный Autofac? Является ли оно предоставленным как свойство контроллера или что?

Проверьте это и не забывайте оставлять комментарии.

Удачи вам!

+0

Это не сработает ..., класс Startup создает DI, но сам он не может использовать инъекцию. –

+0

Нет, класс Startup не создает DI. В приведенном коде Application_start делает. –

+0

А ... Я имел в виду класс запуска OWIN ..., https://stackoverflow.com/questions/33654149/autofac-injection-of-data-into-owin-startup-class –