2016-02-04 6 views
3

Я очень новичок в инъекции зависимостей Autofac, и у меня есть эти вопросы, связанные с моим проектом. Я прочитал много статей, но я не вижу четкой картины по некоторым из моих вопросов. Mine - это сервисное приложение на .Net REST API. Я делаю регистрацию экземпляра в модуле App_Start, как показано ниже.InstancePerLifeTimeScope и время жизни объектов

private static IContainer RegisterServices(ContainerBuilder builder) 
     { 
      builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
      builder.RegisterType<DCLMessengerContext>() 
        .As<DbContext>() 
        .ExternallyOwned() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<DbFactory>() 
        .As<IDbFactory>() 
        .ExternallyOwned() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<UnitOfWork>() 
        .As<IUnitOfWork>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterGeneric(typeof(EntityBaseRepository<>)) 
        .As(typeof(IEntityBaseRepository<>)) 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<PersonServiceClient>() 
        .As<IPerfService>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<PagingServiceContractClient>() 
        .As<PagingServiceContract>() 
        .InstancePerLifetimeScope(); 
      builder.RegisterType<MessageService>() 
        .As<IMessageService>() 
        .InstancePerLifetimeScope(); 
      Container = builder.Build(); 
      return Container; 

     } 

Моего слой сервис «MessageService» и там я выполнять все операции по интеграции БД и другой и получать экземпляры через инъекцию конструктора. Это те вопросы, которые у меня есть вокруг этой реализации.

  1. Я использую InstancePerLifeTimeScope для всех моих регистраций. Правильно ли это? После жизненного цикла каждого запроса контроллера (http-запрос) будут ли эти экземпляры автоматически удалены?
  2. Нужно ли вручную выполнить любую операцию Dispose в любом из этих экземпляров? (У меня нет каких-либо неуправляемых объектов в моем коде)
  3. Из метода обслуживания мне нужно создать огонь & забыть нить, используя Task.Run(). Каков наилучший подход к подаче экземпляров этого огня & забыть тему? Если я использую InstancePerLifeTimeScope, я вижу, что новый поток также получает те же экземпляры, которые доступны через класс службы, поэтому я просто запутался, когда эти экземпляры будут удалены?
+0

См. [«Если вопросы включают« теги »в их названиях?»] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles) , где консенсус «нет, они не должны»! –

+0

Спасибо за обновление этого. Надеюсь, я смогу обновить tilte как «InstancePerLifeTimeScope в Autofac и время жизни объектов». Также я надеюсь, что не будет никаких проблем при добавлении дополнительных тегов (не с заголовком), в данном случае «ASP.Net Web API»? –

+0

, что сделало бы одно идеальное редактирование! –

ответ

1

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

  1. Итак, если вы используете их в контроллерах. У вас будет один объект для каждого запроса, и они будут удалены. Но если вы разрешите их в одном объекте, они будут жить с этим объектом.

Это правильный подход?

Это зависит от того, что вам нужно. Если вам нужен одиночный объект, это не так. Если вы просто хотите использовать эту службу в области запроса, используйте instanceperrequest, это лучше.

  1. Autofac автоматически вызывает удаление для объектов IDisposable. Если вам нужна утилита , выполните ее. Это не связано с autofac.
  2. Если вы используете другой поток, разрешите объекты в этом потоке. В противном случае, когда запрос будет удален, ваши объекты будут удалены, и ваш поток будет терпеть неудачу. Проверьте this.
+0

Благодарим вас за отзыв В моем случае, как я уже упоминал, я объявляю все свои объекты как «InstancePerLifeTimeScope». Основываясь на моем понимании, объекты будут доступны на протяжении всего срока службы запроса (HTTP-вызов службы). Когда я реализую Dispose() в некоторых из этих экземпляров, я вижу, что инфраструктура Autofac автоматически вызывает удаление и удаление. (из-за ограничения символов, разбиения моих комментариев) –

+0

1. Мой вопрос в том, что если я не реализую интерфейс dispose на этих классах, будут ли эти экземпляры оставаться в памяти, и эти объекты могут вызвать утечку памяти в приложении и, в конечном итоге, приложение умрет? Значит, эти объекты никогда не собираются убирать, пока мы не перейдем к утилизации пула приложений? –

+0

2. Если приведенное выше утверждение истинно, и рекомендуется реализовать Dispose во всех экземплярах, здесь, в моем случае, я должен реализовать Dispose во всех объектах, которые я зарегистрировал в Autofac? Кроме того, у меня есть много классов, которые я создаю изнутри через эти зарегистрированные Autofac классы, нужно ли реализовать Dispose на всех этих объектах? Короче говоря, если мы используем регистрацию Autofac или внутренне создаем какой-либо экземпляр (прямое ключевое слово)? –