2012-06-27 18 views
0

我在這裏有一種情況,看起來非常像來自NHibernate世界的「SELECT N + 1」。如何解決當前LifeTimeScope中存在其他組件的組件?

我創建一個應用程序ASP.NET MVC應用程序和的HomeController需要一個IUserSignUpServiceIUserSignUpService「活在」應用程序服務層其中它綁定到具體類UserSignUpService

的UserSignUpService有2依賴性:

public IUserRepository UserRepository { get; set; } 
public Domain.Services.IUserSignUpService SignUpService { get; set; } 

public UserSignUpService(IUserRepository userRepository, Domain.Services.IUserSignUpService signUpService) 
{ 
    this.UserRepository = userRepository; 
    this.SignUpService = signUpService; 
} 

當Autofac是解決IUserSignUpService一種生活應用服務層中,它需要解決IUserRepository依賴的是生活在持久層和中Domain.Services.IUserSignUpService(我知道,名字相同,但他們不同),它們位於域內,並在向數據庫執行INSERT SQL之前執行多個操作。

IUserRepository接口是由需要一個的ISession例如經由構造待注射UserRepository類中實現。這裏

我的觀點是:

如果我繼續使用這種方法,每次我收到的HttpRequest到HomeController的我要開始一個新的ISession(因爲它是UserRepository的構造函數依賴,這是一個構造函數依賴於IUserSignUpController,它是HomeController的構造函數依賴項)。

我並不需要每一次。也許我可以指示Autofac只在當前LifeTimeScope中存在IUnitOfWork接口的實例時解析ISession。

可能嗎?

+0

你有2個'IUserSignUpService'接口?一個在服務層,一個在域層?這對於任何從事項目工作的人來說都會很困惑。如果他們做了不同的事情(他們肯定會這樣做),請以不同的名稱命名。 – Steven

+0

我會的。現在我正在做一個「超級重構」:)。來自應用程序服務層的IUserSignUpService是協調關於註冊過程(發送電子郵件,移動某些文件等)的各種操作的「起點」,而域中的IUserSignUpService正在處理與域相關的事情。在將值保存到數據庫之前,需要完成域級別的幾項操作。我知道,從外面看的任何人都很困惑。 :) – cidico

回答

2

測試是否做額外的工作來不構建ISession是過早的優化。是否有重大的perf擊中?

如果是這樣,你可以在Lazy <>和Autofac will delay instantiation中包裝任何「不需要每次都需要」的構造函數依賴項。

+0

現在我正處於開發的早期階段。我知道這似乎是一個不成熟的優化,但我試圖避免不必要的數據庫連接和交易。現在我的基礎非常輕巧,我需​​要盡我所能地使用服務器。我在問這個問題,因爲大部分時間會有很多操作會觸發緩存,所以除非緩存過期,否則我不需要數據庫。 – cidico

+0

你有點回答我的問題!感謝您指點正確的方式!在這裏添加更多的上下文。我希望能夠從我的應用程序服務層控制我的數據庫工作流程。我希望儘可能少地瞭解Controller,因爲我將要使用此代碼的移動客戶端和Windows Service(以及它相對於* NIX世界)。 – cidico

相關問題