2012-09-03 30 views
3

我創建了一個windows服務來構建和發送電子郵件。我已經實現了依賴注入,我使用Autofac作爲DI容器。Autofac垃圾回收 - BeginLifetimeScope

我的問題是,隨着服務的運行,分配的內存不斷增加,目前超過1GB。 I read this article about lifetimes 從這裏我加入了BeginLifetimeScope,而不是直接從容器中解析。但是這並沒有解決問題。任何意見讚賞。

下面是我的服務onStart方法中的Autofac配置。

ContainerBuilder builder = new ContainerBuilder(); 

//Register the Database context 
builder.RegisterType<DbContainer>().As<IDbContainer>(); 

//Register a single shared instance of Email Manager which will be shared by all EmailProcessing instances 
builder.Register(c => new EmailManager()).As<IEmailManager>()).SingleInstance(); 

//Register email processing classes 
builder.Register(c => new EmailBuilder(c.Resolve<IDbContainer>(), c.Resolve<IEmailManager>())).As<IEmailBuilder>(); 

_container = builder.Build(); 

以下是每5秒運行一次的電子郵件計時器方法。

private void EmailTimerElapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    using (var lifetime = _container.BeginLifetimeScope()) 
    { 
      //Builder, and any of its disposable dependencies, will 
      //be disposed of when the using block completes 
      IEmailBuilder builder = lifetime.Resolve<IEmailBuilder>(); 
      //Execute the process emails method 
      builder.ProcessEmails(); 
    } 

    emailTimer.Start(); 
} 

我希望每個電子郵件計時器迭代都使用EmailManager的同一個實例,而不是其他所有事件的新實例。

編輯

有沒有一種方法,以檢查是否EmailBuilder和所有的依賴已經被佈置並準備GC?

很多我的對象正在進入Generation2並被保留。在生命週期完成後不應該處置它們?

+0

你鏈接到的文章只是救了我:)謝謝! – defines

回答

2

Autofac設置看起來很好。你確定DbContainer發佈所有資源嗎?

+0

DbContainer是實體框架。 Autofac會在生命週期結束時不自動處理它嗎? – ministrymason

+0

DbContainer是你開發的東西嗎?我不認爲它是EF的一部分... –

+0

其實體框架上下文有每個數據庫表IDbSets – ministrymason